Python Selenium爬取class自动生成的div元素问题求助
解决方案
1. 替换依赖动态class的定位逻辑
你不需要依赖外层自动生成的动态class来过滤内容,拿到无关内容的核心原因是页面内提问区、回复区都带有corpus类,直接取第一个corpus块(提问内容永远是页面第一个符合规则的块)即可,修改XPath为:
# 仅定位第一个提问内容块的p标签 questions = driver.find_elements(By.XPATH, '(//div[@class="corpus"])[1]//div[@class="body-bd"]//p') # 作者、日期同理只取第一个提问块的内容 authors = driver.find_elements(By.XPATH, '(//div[@class="corpus"])[1]//div[@class="metadata"]//dl[@class="author-name"]//dd//a') dates = driver.find_elements(By.XPATH, '(//div[@class="corpus"])[1]//div[@class="metadata"]//dl[@class="date"]//dd')
如果仍有冲突,可以进一步通过父级的稳定属性过滤,完全不需要用到动态class。
2. 修复现有代码的逻辑bug
你当前的三重循环会生成笛卡尔积重复数据,每个问题页仅对应1个作者、1个提问日期,不需要嵌套循环,修改为:
questions_list = [] for link in forum_links: driver.get(link) # 提取内容,直接拼接所有p标签文本、取第一个匹配的作者日期即可 question_text = '\n'.join([p.text for p in driver.find_elements(By.XPATH, '(//div[@class="corpus"])[1]//div[@class="body-bd"]//p')]) author = driver.find_element(By.XPATH, '(//div[@class="corpus"])[1]//div[@class="metadata"]//dl[@class="author-name"]//dd//a').text date = driver.find_element(By.XPATH, '(//div[@class="corpus"])[1]//div[@class="metadata"]//dl[@class="date"]//dd').text questions_list.append([question_text, author, date]) # 全部收集完成后统一写文件,避免重复IO q_df = pd.DataFrame(questions_list, columns=['问题内容','作者','发布时间']) q_df.to_csv('colrow.csv', index=False, encoding='utf-8-sig')
3. 优化基础逻辑提高稳定性
- 把固定的
time.sleep(10)替换为显式等待,避免页面加载速度波动导致的元素找不到报错:# 点击cookie按钮的逻辑替换为 WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, 'popin_tc_privacy_button_3'))).click() - 你当前使用的
find_elements_by_*方法在Selenium 4.0+版本已经废弃,建议统一替换为find_elements(By.XXX, 定位符)的写法,避免后续版本升级报错。 - 收集链接的逻辑可以统一提取,不需要分if/else分支重复写代码,全部链接收集完成后再一次性写入csv即可。
内容的提问来源于stack exchange,提问作者ossama assaghir
相关产品推荐
相关产品推荐

