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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:51:02