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

Selenium遍历父元素集合时重复获取首个子元素的解决方法

解决方案

问题根源在于子元素的XPath是绝对路径:以//开头的XPath会从整个DOM文档的根节点开始查找,而非当前遍历的父元素节点下。因此每次调用comment.find_element()时,都会返回整个文档中第一个匹配的元素,导致重复输出。

修改步骤

  1. 将子元素XPath改为相对路径:在XPath前添加.,表示从当前节点(即遍历的comment父元素)开始查找。
  2. 简化子元素XPath(可选):既然已经基于父元素定位,无需重复写完整的父路径,直接定位当前父元素下的目标子节点即可。

修改后的consts.py

GENERAL_COMMENT_SECTION = "//ul//ul/div/li/div"
# 改为相对路径,从当前父元素下查找子节点
USERNAME_BY_XPATH = ".//h3"
COMMENTS_BY_XPATH = ".//div[@class='_a9zs']/span"
COMMENT_TIME = ".//time"

修改后的核心逻辑代码

comments = self.wait.until(
        EC.presence_of_all_elements_located((By.XPATH, GENERAL_COMMENT_SECTION)))

with open('src/comment.txt', 'a+', encoding="utf-8") as f:
     for comment in comments:
        username = comment.find_element(By.XPATH, USERNAME_BY_XPATH).text
        comment_text = comment.find_element(By.XPATH, COMMENTS_BY_XPATH).text
        comment_time = comment.find_element(By.XPATH, COMMENT_TIME).get_attribute("title")
        f.write(f"{username},{comment_text},{comment_time}\n")
# 注:with语句会自动关闭文件,无需手动调用f.close()

说明

  • 相对路径./或.开头的XPath,会限定在当前父元素的子树中查找,确保每次遍历都获取当前父元素下的对应子节点。
  • 简化后的XPath更易维护,也避免了因路径过长导致的定位错误。

内容的提问来源于stack exchange,提问作者kametguler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 10:50:24