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

