无法使用 BS4 从巴塞罗那足球俱乐部网站获取西甲积分表的正确数据

问题描述 投票:0回答:2

我正在尝试从 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']
python python-3.x web-scraping beautifulsoup python-requests
2个回答
0
投票

该网站最初仅发送上一季的结果。通过在网络选项卡中打开“开发者工具”在浏览器中切换赛季,您可以看到它会根据需要下载其他赛季,并且当您在浏览器中打开网站时,它会自动加载 24/25 赛季,但作为单独的 javascript 请求(在主 html 已加载之后)。

这些额外请求(目前)的形式为

https://api-fcb.pulselive.com/football//standings?compSeasons=724&detail=2&altIds=true
。它们也恰好返回 JSON,而不是 HTML,这应该更容易解析(希望只是调用
response.json()
)。


0
投票

如上所述,使用 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'])
© www.soinside.com 2019 - 2024. All rights reserved.