Python爬取HTML表格出现cannot set a row with mismatched columns错误如何处理
报错原因与解决方案
报错cannot set a row with mismatched columns的核心原因是创建的Pandas DataFrame列数,与待插入的行数据元素数量不匹配,你的代码存在以下两处可直接触发该错误的问题:
- 表头收集逻辑错误:遍历
<th>标签提取表头时,代码错误地将整个table对象追加到表头列表中,而非追加提取到的表头文本title,直接导致DataFrame列数与实际表格列数完全不一致 - 变量重名风险:请求头变量与表头变量都命名为
headers,虽然该问题不会直接触发本次报错,但属于不规范写法,易引发后续逻辑异常
修正后的代码
import requests from bs4 import BeautifulSoup import pandas as pd # 请求头单独命名,避免和表头变量冲突 req_headers ={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.3'} r = requests.get('https://jleague.co/clubs/sapporo/player/', headers=req_headers) soup = BeautifulSoup(r.content, 'lxml') table = soup.find('table', class_='commonTable playerData') table_headers = [] # 修正追加逻辑,追加提取到的表头文本 for i in table.find_all('th'): title = i.text.strip() table_headers.append(title) df = pd.DataFrame(columns=table_headers) for row in table.find_all('tr')[1:]: data = row.find_all('td') row_data = [td.text.strip() for td in data] # 增加长度校验,避免因单元格合并等原因导致行长度不匹配触发报错 if len(row_data) == len(table_headers): length = len(df) df.loc[length] = row_data
优化建议
如果目标网页表格结构规则无特殊嵌套,可直接使用Pandas内置的pd.read_html()方法直接提取表格数据,无需手动解析DOM,代码会更简洁高效。
内容的提问来源于stack exchange,提问作者Arslan Aziz
相关产品推荐
相关产品推荐

