如何向未知大小的DataFrame逐单元格插入表格爬取数据?
问题描述
现有一段可正常运行的代码,原本会打印表格单元格的内容(变量
d),我希望将这个操作改为把数据插入到Pandas的DataFrame中。驱动程序从大小不固定的表格提取数据,我已经获取到了行数rc和列数cc,请问如何在遍历表格时把这些值插入DataFrame?原始代码:
df = pd.DataFrame() # 定位表格行 r = driver.find_elements_by_xpath("//*[@id='contentScrollPoint']/div[4]/div[4]/div[3]/div/div") # 定位表格列 c = driver.find_elements_by_xpath("//*[@id='contentScrollPoint']/div[4]/div[4]/div[3]/div/div/table/tbody/tr[2]/td") # 获取行数 rc = len(r) # 获取列数 cc = len(c) # 遍历排除表头的表格行 for i in range(2, rc+2 + 2): # 遍历表格列 for j in range(1, cc + 1): # 获取单元格文本 d = driver.find_element_by_xpath("//*[@id='contentScrollPoint']/div[4]/div[4]/div[3]/div/div/table/tbody/tr["+str(i)+"]/td["+str(j)+"]").text print(d) # 此处需要改为插入DataFrame
解决方案
不建议在循环里逐个单元格插入DataFrame(这种操作效率极低,因为DataFrame的结构特性会导致频繁复制数据),更高效的方式是先把所有行数据收集成嵌套列表,最后一次性转换成DataFrame。
修改后的代码如下:
import pandas as pd # 初始化空列表,用于存储整表数据 table_data = [] # 定位表格行、列并获取行列数 r = driver.find_elements_by_xpath("//*[@id='contentScrollPoint']/div[4]/div[4]/div[3]/div/div") c = driver.find_elements_by_xpath("//*[@id='contentScrollPoint']/div[4]/div[4]/div[3]/div/div/table/tbody/tr[2]/td") rc = len(r) cc = len(c) # 遍历目标行(排除表头) for i in range(2, rc + 2 + 2): # 初始化当前行的空列表 row_data = [] # 遍历当前行的所有列 for j in range(1, cc + 1): # 使用f-string简化XPath拼接 cell_text = driver.find_element_by_xpath(f"//*[@id='contentScrollPoint']/div[4]/div[4]/div[3]/div/div/table/tbody/tr[{i}]/td[{j}]").text row_data.append(cell_text) # 将当前行数据加入整表数据列表 table_data.append(row_data) # 一次性将嵌套列表转换为DataFrame df = pd.DataFrame(table_data) # (可选)如果需要设置表头,可以提取表头文本后传入columns参数 # 示例代码: # headers = [header.text for header in driver.find_elements_by_xpath("//*[@id='contentScrollPoint']/div[4]/div[4]/div[3]/div/div/table/tbody/tr[1]/th")] # df = pd.DataFrame(table_data, columns=headers)
关键修改说明
- 用
table_data和row_data两个列表暂存数据,避免循环中频繁修改DataFrame,大幅提升运行效率 - 使用f-string格式化XPath,比传统字符串拼接更简洁、可读性更强
- 最后一次性生成DataFrame,符合Pandas的高效使用原则
- 附带了提取表头并设置列名的可选逻辑,按需启用
内容的提问来源于stack exchange,提问作者Leo Torres
相关产品推荐
相关产品推荐

