我在寻求一些帮助.我想从SofaScore(https://www.sofascore.com/)上搜集关于意甲球队的定量信息,特别是首发阵容,网站分配的评级,可能还有一些更高级的统计数据.然而,我对HTML和Web抓取的知识是有限的,我正在努力从网站中提取这些信息.

目前,我正在try 提取单场比赛的数据,但我不确定如何概括代码来收集所有回合和球队的信息.

下面是我到目前为止编写的代码,但似乎BeautifulSoup的find方法的部分没有针对网站的正确部分.

import bs4
from bs4 import BeautifulSoup as bs
import requests
import webbrowser

link='https://www.sofascore.com/sassuolo-atalanta/LdbsTfb'
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.691' 

response=requests.get(link, headers={'user-agent':user_agent})
response.raise_for_status()

soup=bs(response.text, 'html.parser')
div_voti=soup.find('div', class_="sc-fqkvVR eeeBnr sc-d8bc48b6-2 cUcAWg")
print(div_voti)

我知道这可能是一个基本的问题,但我感到有点迷茫.感谢所有能提供帮助的人!

推荐答案

您在页面上看到的数据是通过Java脚本从外部URL加载的(因此beautifulsoup看不到它).要模拟这些请求,您可以使用以下示例:

from itertools import zip_longest

import requests
from bs4 import BeautifulSoup

headers = {
    "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/117.0"
}

url = "https://www.sofascore.com/sassuolo-atalanta/LdbsTfb"
soup = BeautifulSoup(requests.get(url, headers=headers).content, "html.parser")
id_ = soup.select_one('link[href*="android-app:"]')["href"].split("/")[-1]

lineups_url = f"https://api.sofascore.com/api/v1/event/{id_}/lineups"

# for goals, substitutions etc use this url:
# incidents_url = "https://api.sofascore.com/api/v1/event/11407341/incidents"

lineups = requests.get(lineups_url, headers=headers).json()
for h, a in zip_longest(lineups["home"]["players"], lineups["away"]["players"]):
    if h:
        h = h["player"]["name"] + f" ({h['player']['position']})"
    else:
        h = "-"

    if a:
        a = a["player"]["name"] + f" ({a['player']['position']})"
    else:
        a = "-"

    print(f"{h:<50} {a:<50}")

打印:

Andrea Consigli (G)                                Juan Musso (G)                                    
Jeremy Toljan (D)                                  Berat Djimsiti (D)                                
Martin Erlić (D)                                   Giorgio Scalvini (D)                              
Mattia Viti (D)                                    Sead Kolašinac (D)                                
Matías Viña (D)                                    Davide Zappacosta (M)                             
Matheus Henrique (M)                               Marten de Roon (M)                                
Maxime López (M)                                   Teun Koopmeiners (M)                              
Grégoire Defrel (F)                                Mario Pašalić (F)                                 
Nedim Bajrami (M)                                  Matteo Ruggeri (M)                                
Armand Laurienté (F)                               Ademola Lookman (F)                               
Andrea Pinamonti (F)                               Duván Zapata (F)                                  
Filippo Missori (D)                                Éderson (M)                                       
Kristian Thorstvedt (M)                            Charles De Ketelaere (M)                          
Kevin Miranda (D)                                  Gianluca Scamacca (F)                             
Cristian Volpato (M)                               Nadir Zortea (D)                                  
Samuele Mulattieri (F)                             Michel Ndary Adopo (M)                            
Gianluca Pegolo (G)                                Francesco Rossi (G)                               
Alessio Cragno (G)                                 Marco Carnesecchi (G)                             
Yeferson Paz (M)                                   Rafael Tolói (D)                                  
Luca Lipani (M)                                    Caleb Okoli (D)                                   
Daniel Boloca (M)                                  Mitchel Bakker (M)                                
Emil Konradsen Ceide (F)                           Luis Muriel (F)                                   

Python-3.x相关问答推荐

如何从拼图分区数据集中读取数据到Polar

如何通过Pandas为不同的列集垂直设置列数据?

Pandas -我们如何在一行中应用多个要求

Python GUI:tkinter应用程序作为Windows的实时桌面

visual studio代码窗口中未激活虚拟环境11

两个 y 轴在零处对齐的 plotly barplot

如何将 WebDriver 传输到导入的测试?

如何统计一个值连续出现的次数?

Django - ValueError:无法将字符串转换为浮点数:''

Pandas 窗口聚合两个排序表

如何使用`re.findall`从字符串中提取数据

包含值超出范围的 ID 的新 DataFrame 列?

将变量传递给 Google Cloud 函数

日志(log)模块不适用于 Python3

Tkinter 窗口显示(无响应)但代码正在运行

理解 Keras 的 ImageDataGenerator 类中的 `width_shift_range` 和 `height_shift_range` 参数

tensorflow 中 numpy.newaxis 的替代方案是什么?

创建日志(log)文件

__cause__ 和 __context__ 有什么区别?

Python pathlib 获取父级相对路径