如何修复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
相关产品推荐
相关产品推荐

