如何从网站上的最后一个表中提取数据

2024-04-19 09:11:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图使用以下代码从该网站上获取“每场比赛的球队统计数据”表:

from urllib.request import urlopen as uo
from bs4 import BeautifulSoup as BS
import pandas as pd

url = 'https://www.basketball-reference.com/leagues/NBA_2020.html'
html = uo(url)
soup = BS(html, 'html.parser')
soup.findAll('tr')

headers = [th.getText() for th in soup.findAll('tr')]
headers = headers[1:]
print(headers)

rows = soup.findAll('tr')[1:]
team_stats = [[td.getText() for td in rows[i].findAll('td')]
                for i in range(len(rows))]

stats = pd.DataFrame(team_stats, columns=headers)

但它返回以下错误:

AssertionError: 71 columns passed, passed data had 212 columns

Tags: columnsinfromimportforhtmlasstats
1条回答
网友
1楼 · 发布于 2024-04-19 09:11:38

问题是数据隐藏在HTML的注释部分中。要提取的表在浏览器中用Javascript呈现。使用requests或urllib请求页面只会生成原始HTML

因此,请注意,如果使用BeautifulSoup搜索要查找的适当标记,则必须使用“查看页面源代码”检查页面的源代码,而不是使用“检查元素”检查呈现页面的源代码

试试这个:

import requests
from bs4 import BeautifulSoup
import pandas as pd

url = 'https://www.basketball-reference.com/leagues/NBA_2020.html'
html = requests.get(url)

section_start = '<span class="section_anchor" id="team-stats-per_game_link" data-label="Team Per Game Stats">'
block_start = html.text.split(section_start)[1].split("<! ")[1]
block = block_start.split(" >")[0]
soup = BeautifulSoup(block)

data = [th.get_text(",") for th in soup.findAll('tr')]
header = data[0]
header = [x.strip() for x in header.split(",") if x.strip() !=""]
data = [x.split(",") for x in data[1:]]

pd.DataFrame(data, columns=header)

说明:您首先需要通过简单地在节之前拆分原始HTML来查找已注释的节。将节提取为文本,转换为soup,然后解析

相关问题 更多 >