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

Python+Selenium爬取供应商门户表格:循环未追加列表求助

解决你的Selenium表格爬取问题

Hey Nico, nice to see you automating your workflow—great first step! Let's tackle your two questions one by one:

1. 为什么列表每次只保留最后一行,且len(row_text)总是1?

你遇到的问题有两个核心原因:

  • 列表被重复重置:你把row_text = []放在了for i in range(2, row_nos)循环的内部,这意味着每次循环都会新建一个空列表,之前循环获取的行数据会被完全覆盖,最后自然只剩最后一行的内容。
  • 定位逻辑偏差:你的row = driver.find_elements(By.XPATH, "...tr["+str(i)+"]")定位的是整行<tr>元素,find_elements返回的是包含单个<tr>的列表,所以for content in row只会循环一次,row_text每次只添加一个元素,这就是len(row_text)总是1的原因。而且你其实需要提取的是每行里的单元格<td>内容,不是整行的文本。

修正后的代码示例

# 确定行数
rows = driver.find_elements(By.XPATH, "//*[@id='docflow.list_DocFlowList']/tbody/tr/td/table/tbody/tr")
row_nos = len(rows)

# 把row_text初始化移到循环外面,避免每次重置
row_text = []

# 从2开始循环排除表头(注意:range是左闭右开,所以要+1才能包含最后一行)
for i in range(2, row_nos + 1):
    # 定位当前行的所有td单元格
    cells = driver.find_elements(By.XPATH, "//*[@id='docflow.list_DocFlowList']/tbody/tr/td/table/tbody/tr["+str(i)+"]/td")
    # 提取当前行的所有单元格文本,组成一个列表
    current_row = [cell.text for cell in cells]
    # 将当前行添加到总列表中
    row_text.append(current_row)

# 现在打印总列表的长度,应该是总行数减1(排除表头)
print(len(row_text))
# 打印每一行的内容
for row in row_text:
    print(row)

2. 数据清洗:按行爬取还是按列爬取?

这取决于你的表格结构和后续清洗需求,但大多数情况下按行爬取更实用:

  • 按行爬取时,每一行对应一条完整的记录(比如一个供应商的信息),后续可以直接把row_text转成pandas.DataFrame,每一列自然对应一个字段,非常方便做清洗、筛选、统计等操作。
  • 如果你的表格有复杂结构(比如合并单元格、列之间关联弱),或者你需要单独对某几列做特殊处理(比如提取特定格式的数据),那按列爬取可能更灵活,但这种场景相对少见。

总的来说,先按行爬取拿到结构化的行数据,再用pandas做清洗是最常规高效的流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 16:57:39