Selenium与Python网页爬取:HTML表格提取重复行问题求助
问题排查与解决
你的问题出在XPath字符串拼接错误,以及表格行索引的起始值不匹配,导致每次循环都定位到同一个元素,所以重复输出同一行内容。
具体问题分析
- XPath变量解析错误:你原代码里写的
tr["+str(r)+"]是无效的字符串拼接方式——Python不会把引号里的str(r)解析成变量值,而是把整个["+str(r)+"]当成XPath的字面量部分,浏览器找不到匹配的节点时,会默认返回第一个符合前面路径的tr元素,所以每次都输出同一行。 - 索引起始值不匹配: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
相关产品推荐
相关产品推荐

