You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 07:45:07