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

网页爬取时如何处理表头的colspan属性?以福布斯印度企业榜为例

解决维基百科表格colspan导致的列数不匹配问题

问题出在表格的复合表头:Rank和Forbes Rank这两个表头都带有colspan="2"属性,意味着每个表头对应2列数据。直接提取<th>标签只能得到9个表头,但实际数据行有11列,自然会出现列数不匹配的错误。下面是两种可行的解决方法:

方法1:手动补全表头(简单直接)

既然明确哪两个表头各占2列,我们可以手动拆分这两个表头,让总列数和数据列数一致。比如把Rank拆分为"Rank (2022)"和"Rank (Change)",Forbes Rank拆分为"Forbes Rank (2022)"和"Forbes Rank (Change)",其他表头保持不变。

修改后的代码如下:

from bs4 import BeautifulSoup
import requests
import pandas as pd

url = 'https://en.wikipedia.org/wiki/List_of_largest_companies_in_India'
page = requests.get(url)
soup = BeautifulSoup(page.text,'html')

table = soup.find('table')
# 手动补全表头,拆分带colspan的列
Table_Title = [
    "Rank (2022)", "Rank (Change)",
    "Forbes Rank (2022)", "Forbes Rank (Change)",
    "Name", "Industry", "Revenue (₹ Crore)",
    "Revenue Growth", "Profit (₹ Crore)", "Profit Growth", "Assets (₹ Crore)"
]

df = pd.DataFrame(columns=Table_Title)

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(Table_Title):
        df.loc[len(df)] = individual_row_data

print(df.head())

方法2:自动解析colspan属性(通用型)

如果需要适配更多带colspan的表格,可以通过解析<th>标签的colspan属性,自动生成对应数量的表头,避免手动修改的麻烦。

修改后的代码如下:

from bs4 import BeautifulSoup
import requests
import pandas as pd

url = 'https://en.wikipedia.org/wiki/List_of_largest_companies_in_India'
page = requests.get(url)
soup = BeautifulSoup(page.text,'html')

table = soup.find('table')
titles = table.find_all('th')

Table_Title = []
for title in titles:
    # 获取colspan属性,默认值为1
    colspan = int(title.get('colspan', 1))
    title_text = title.text.strip()
    # 根据colspan数量添加表头,添加后缀区分
    if colspan > 1:
        for i in range(colspan):
            # 可根据实际需求修改后缀格式,比如改成年份/变化描述
            Table_Title.append(f"{title_text} ({i+1})")
    else:
        Table_Title.append(title_text)

df = pd.DataFrame(columns=Table_Title)

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(Table_Title):
        df.loc[len(df)] = individual_row_data

print(df.head())

说明:第二种方法会自动处理所有带colspan的表头,你可以根据表格实际内容调整后缀格式,让表头更贴合数据含义。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 01:35:14