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
相关产品推荐
相关产品推荐

