使用Selenium爬取表格写入Pandas DataFrame报TypeError如何解决
问题解决:Selenium爬取表格转Pandas DataFrame TypeError修复
错误原因
你遇到的TypeError核心来自两个逻辑错误:
- 你用
.text获取的headers和rows都是整段连续字符串,不是按列/按行拆分的列表结构。Pandas构造DataFrame时要求columns参数传入和数据列数匹配的列表,单个字符串无法作为多列表头,同时未拆分的行数据也无法匹配列数要求 - 你直接提取整个tbody的文本,没有按行、按列拆分数据,格式完全不符合Pandas的输入规范
修复后的完整代码
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium import webdriver import pandas as pd # 初始化驱动,路径前加r防止Windows路径转义,新版本Selenium可省略路径自动匹配chromedriver driver = webdriver.Chrome(r'C:\Program Files (x86)\chromedriver.exe') driver.get("https://www.fami-qs.org/certified-companies-6-0.html") # 切换到表格所在iframe WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe[title='Inline Frame Example']"))) # 获取表头:逐个提取th元素文本,生成表头列表 header_elements = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//table[@id='sites']//thead//th"))) headers = [h.text.strip() for h in header_elements] # 获取行数据:先提取所有行元素,再逐行提取单元格文本,生成二维数据列表 row_elements = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//table[@id='sites']//tbody//tr"))) table_data = [] for tr in row_elements: td_elements = tr.find_elements(By.TAG_NAME, "td") row_data = [td.text.strip() for td in td_elements] table_data.append(row_data) # 构造DataFrame df = pd.DataFrame(table_data, columns=headers) print(df) # 任务完成后关闭驱动释放资源 driver.quit()
补充注意事项
- 如果需要爬取多页数据,可在翻页操作完成后重复行数据获取逻辑,将新数据追加到
table_data列表后再统一构造DataFrame - 若出现元素加载超时,可适当延长WebDriverWait的等待时长,或增加页面滚动逻辑确保表格元素完全渲染
内容的提问来源于stack exchange,提问作者Amen Aziz
相关产品推荐
相关产品推荐

