我正在尝试从 https://www.fcbarcelona.com/en/football/first-team/stands 网站提取积分表数据。我想提取当前表(24-25)的数据,但提取的是往年(23-24)表数据
代码:
from bs4 import BeautifulSoup
import requests
url = 'https://www.fcbarcelona.com/en/football/first-team/standings'
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')
team_names_tag = soup.find_all("span", class_="team-row__name--short")
team_names=[]
for team_name in team_names_tag:
team_names.append(team_name.text.replace("\n", "").strip())
print(team_names)
points_tag = soup.find_all("td", class_="table-stat-row table-stat-row--points")
points=[]
for point in points_tag:
points.append(point.text.replace("\n", "").strip())
print(points)
输出:
['R. Madrid', 'FC Barcelona', 'Girona', 'Atlético', 'Athletic Club', 'Real Sociedad', 'Betis', 'Villarreal', 'Valencia', 'Alavés', 'Osasuna', 'Getafe', 'Celta de Vigo', 'Sevilla', 'Mallorca', 'UD Las Palmas', 'Rayo', 'Cádiz', 'Almería', 'Granada']
['95', '85', '81', '76', '68', '60', '57', '53', '49', '46', '45', '43', '41', '41', '40', '40', '38', '33', '21', '21']
该网站最初仅发送上一季的结果。通过在网络选项卡中打开“开发者工具”在浏览器中切换赛季,您可以看到它会根据需要下载其他赛季,并且当您在浏览器中打开网站时,它会自动加载 24/25 赛季,但作为单独的 javascript 请求(在主 html 已加载之后)。
这些额外请求(目前)的形式为
https://api-fcb.pulselive.com/football//standings?compSeasons=724&detail=2&altIds=true
。它们也恰好返回 JSON,而不是 HTML,这应该更容易解析(希望只是调用 response.json()
)。
如上所述,使用 api 访问该数据。然后,您需要解析 json 以获取您想要的信息。这样做的好处是您将获得所有可用数据。
代码:
import requests
import pandas as pd
url = 'https://api-fcb.pulselive.com/football//standings'
headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36'}
payload = {
'compSeasons': '724',
'detail': '2',
'altIds': 'true'}
jsonData = requests.get(url, headers=headers, params=payload).json()
df = pd.json_normalize(jsonData,
record_path=['tables', 'entries'])