如何在网页抓取中给表头添加colspan

0 投票
1 回答
35 浏览
提问于 2025-04-12 07:55

我刚开始接触网页数据抓取,想要抓取这个网站上的2022年福布斯榜单 - https://en.wikipedia.org/wiki/List_of_largest_companies_in_India。但是,表格中的“排名”列和“福布斯排名”列都设置了合并单元格(colspan)为2,这样一来,表头的数量变成了9,而实际的信息却有11条。当我尝试把这些信息放到对应的表头时,就出现了错误(无法设置列数不匹配的行)。

那么,我该如何为“排名”和“福布斯排名”设置合并单元格呢?

这是我的代码:

from bs4 import BeautifulSoup
import requests

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

soup.find('table')
table = soup.find('table')
titles = table.find_all('th')
Table_Title = [title.text.strip() for title in titles]

import pandas as pd
df = pd.DataFrame(columns = Table_Title)
df

column_data = table.find_all('tr')
column_data

for row in column_data[1:]:
    row_data = row.find_all('td')
    individual_row_data = [data.text.strip() for data in row_data]
    length = len(df)
    df.loc[length] = individual_row_data 
    print(individual_row_data)

1 个回答

0

既然你想创建一个 dataframe 并且已经引入了 pandas,那么最简单的办法就是用 [pandas.read_html()][1] 来抓取表格数据:

pd.read_html('https://en.wikipedia.org/wiki/List_of_largest_companies_in_India')[0]
排名 排名(附加) 福布斯2000排名 福布斯2000排名(附加) 公司名称 总部 收入(十亿美元) 利润(十亿美元) 资产(十亿美元) 市值(十亿美元) 行业
0 1 (0) 54 (+1) 信实工业 孟买 86.85 7.81 192.59 228.63 综合企业
...
50 51 (0) 1759 (+208) DMart 孟买 4 0.20 1.93 34.12 零售
51 52 (0) 1759 (+208) Adyar Ananda Bhavan 钦奈 4 0.20 1.93 34.12 零售

另外,你也可以使用 beautifulsoup 来选择数据,并通过 colspan 的值来进行乘法运算:

Table_Title = []

for title in table.find_all('th'):
    if title.get('colspan'):
        Table_Title.extend([title.get_text(strip=True)]*int(title.get('colspan')))
    else:
        Table_Titlepandas.pydata.org/docs/reference/api/pandas.read_html.html

撰写回答