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

Python Selenium表格爬虫仅返回首行重复数据,如何定位当前迭代行内元素

问题修复方案

问题根因

你当前使用driver.find_element_by_xpath执行查找时,是从整个页面的DOM根节点开始匹配元素,每次都会返回全局第一个符合条件的节点,因此循环多次返回的都是第一行的对应单元格内容。

修复方法

将查找的根节点从全局driver替换为当前循环迭代到的行元素r,同时xpath表达式开头加.表示从当前节点的子节点开始查找,另外要注意每次循环初始化新的字典对象,避免覆盖同一块内存的数据。

修改后的参考代码

新版Selenium(推荐写法,适配Selenium 4.0+)

import json
from selenium.webdriver.common.by import By

# 获取所有行
rows = driver.find_elements(By.XPATH, '//tbody/tr')
# 定义列表存储所有行数据,方便最后导出标准JSON格式
data_list = []

for r in rows:
    # 每次循环新建独立字典
    diccionario = {}
    # 从当前行r下查找第一个td,开头的.代表基于当前节点查找
    diccionario["property1"] = r.find_element(By.XPATH, './/td[1]').text
    # 查找当前行下第二个td
    diccionario["property2"] = r.find_element(By.XPATH, './/td[2]').text
    # 如果td有固定class属性,也可以添加过滤条件,例如:
    # diccionario["property1"] = r.find_element(By.XPATH, './/td[@class="对应class名称"][1]').text
    data_list.append(diccionario)

# 一次性写入所有数据,生成标准JSON格式
with open("bbdd.json", "w", encoding="utf-8") as bd:
    json.dump(data_list, bd, ensure_ascii=False, indent=4)

旧版Selenium兼容写法

import json

rows = driver.find_elements_by_xpath('//tbody/tr')
data_list = []

for r in rows:
    diccionario = {}
    diccionario["property1"] = r.find_element_by_xpath('.//td[1]').text
    diccionario["property2"] = r.find_element_by_xpath('.//td[2]').text
    data_list.append(diccionario)

with open("bbdd.json", "w", encoding="utf-8") as bd:
    json.dump(data_list, bd, ensure_ascii=False, indent=4)

补充说明

如果你有逐行追加写入的需求,可以把写入逻辑放到for循环内部,注意逐行追加的JSON不属于标准数组格式,后续读取时需要逐行解析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:15:06