Selenium遍历父元素集合时重复获取首个子元素的解决方法
解决方案
问题根源在于子元素的XPath是绝对路径:以//开头的XPath会从整个DOM文档的根节点开始查找,而非当前遍历的父元素节点下。因此每次调用comment.find_element()时,都会返回整个文档中第一个匹配的元素,导致重复输出。
修改步骤
- 将子元素XPath改为相对路径:在XPath前添加
.,表示从当前节点(即遍历的comment父元素)开始查找。 - 简化子元素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
相关产品推荐
相关产品推荐

