网页爬取时如何处理表头的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
相关产品推荐
相关产品推荐

