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

Selenium与Python网页爬取:HTML表格提取重复行问题求助

问题排查与解决

你的问题出在XPath字符串拼接错误,以及表格行索引的起始值不匹配,导致每次循环都定位到同一个元素,所以重复输出同一行内容。

具体问题分析

  1. XPath变量解析错误:你原代码里写的tr["+str(r)+"]是无效的字符串拼接方式——Python不会把引号里的str(r)解析成变量值,而是把整个["+str(r)+"]当成XPath的字面量部分,浏览器找不到匹配的节点时,会默认返回第一个符合前面路径的tr元素,所以每次都输出同一行。
  2. 索引起始值不匹配:HTML表格中<tr>的XPath索引是从1开始的,但你用range(rows)生成的是从0到rows-1的数字,即使拼接正确,也会漏掉最后一行或者定位到错误的节点。

修正方案

推荐两种解决方式,第二种更高效:

方式1:修正XPath拼接与索引

用Python的f-string来正确拼接XPath,同时循环索引从1开始:

rows = len(driver.find_elements_by_xpath('/html/body/form/fieldset/table[2]/tbody/tr/td[3]/table/tbody/tr[5]/td[2]/div/table[1]/tbody/tr[2]/td[1]/table[2]/tbody/tr'))
time.sleep(2)
print(rows)
# 从1开始遍历到rows(包含rows)
for r in range(1, rows + 1):
    # 用f-string把变量r插入到XPath中
    value = driver.find_element_by_xpath(f'/html/body/form/fieldset/table[2]/tbody/tr/td[3]/table/tbody/tr[5]/td[2]/div/table[1]/tbody/tr[2]/td[1]/table[2]/tbody/tr[{r}]')
    print(value.text)

方式2:一次性获取所有行元素(更高效)

直接获取所有目标行的WebElement列表,再遍历输出,这样只需要执行一次元素查找,减少浏览器交互次数:

# 直接获取所有行的元素列表
row_elements = driver.find_elements_by_xpath('/html/body/form/fieldset/table[2]/tbody/tr/td[3]/table/tbody/tr[5]/td[2]/div/table[1]/tbody/tr[2]/td[1]/table[2]/tbody/tr')
time.sleep(2)
print(len(row_elements))
# 遍历每个行元素
for row in row_elements:
    print(row.text)

额外建议

你的XPath路径太长太绝对,很容易因为页面结构微小变化就失效,建议改用更简洁的相对路径,比如通过表格的class、id属性来定位,或者结合<td>的内容特征来缩小范围,提升代码的稳定性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 15:57:34