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

如何修复BeautifulSoup爬虫中的ValueError:列数不匹配无法设置行

解决方法

这个错误的核心原因是DataFrame的列数与你试图插入的行数据长度不匹配,同时初始化列名的方式也完全错误,具体修正步骤如下:

1. 修正列名初始化逻辑

你直接把BeautifulSoup的tr标签对象传给了DataFrame的columns参数,这完全不符合要求。正确的做法是从目标表格里提取表头单元格(th标签)的文本作为列名:

# 从目标表格中获取表头行
header_row = table.find('tr')
# 提取每个表头单元格的文本作为列名
columns = [th.text.strip() for th in header_row.find_all('th')]
# 用正确的列名初始化DataFrame
df = pd.DataFrame(columns=columns)

2. 确保行数据与列数匹配

你的循环从column_data[2:]开始,可能跳过了有效数据行或者包含了不完整的行,同时要过滤掉td数量和列数不一致的行,避免报错:

column_data = table.find_all('tr')
# 从第2行开始(索引1),根据实际表格结构调整,这里原表格第1行是表头,第2行开始是数据
for row in column_data[1:]:
    row_data = row.find_all('td')
    individual_row_data = [data.text.strip() for data in row_data]
    # 只有当行数据长度和列数一致时才插入
    if len(individual_row_data) == len(df.columns):
        df.loc[len(df)] = individual_row_data

完整修正后的代码

from bs4 import BeautifulSoup
import pandas as pd
import requests

url = 'https://en.wikipedia.org/wiki/List_of_largest_companies_by_revenue'
page = requests.get(url)
soup = BeautifulSoup(page.text, 'html')
# 获取目标表格
table = soup.find_all('table')[0]

# 提取正确的列名
header_row = table.find('tr')
columns = [th.text.strip() for th in header_row.find_all('th')]
df = pd.DataFrame(columns=columns)

# 遍历数据行并插入
column_data = table.find_all('tr')
for row in column_data[1:]:
    row_data = row.find_all('td')
    individual_row_data = [data.text.strip() for data in row_data]
    if len(individual_row_data) == len(df.columns):
        df.loc[len(df)] = individual_row_data

print(df.head())

额外说明

  • 维基百科的表格有时候会有合并单元格的情况,导致部分行的td数量和表头列数不一致,加入长度判断可以跳过这些异常行。
  • 如果你确定原表格的前两行都是表头(比如包含二级表头),可以把循环起始索引改成2,但要确保剩余行的td数量和列数匹配。

内容的提问来源于stack exchange,提问作者CDac

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 15:57:34