如何在网页抓取中给表头添加colspan
我刚开始接触网页数据抓取,想要抓取这个网站上的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