pandas 如何刮其他table?

qyyhg6bp  于 2023-05-12  发布在  其他
关注(0)|答案(1)|浏览(68)

我试图从这个页面(https://fbref.com/en/comps/9/stats/Premier-League-Stats)获得球员标准统计表,但当我要求它给我的表,只有球队标准统计表拉。我是不是漏掉了什么?(我的代码在下面)

import pandas as pd

url = "https://fbref.com/en/comps/9/stats/Premier-League-Stats"

tables = pd.read_html(url)
print(len(tables))
print(tables[0])
print(tables[1])
goqiplq2

goqiplq21#

在这种情况下,使用Python获取html,将其保存在本地,并使用编辑器检查/搜索它通常是有帮助的,因为它可能与您在“Web浏览器”中获得的内容不同。

import requests
from   pathlib import Path

url = "https://fbref.com/en/comps/9/stats/Premier-League-Stats"

r = requests.get(url)

# save to local file 
Path("stats.html").write_bytes(r.content)

在编辑器中搜索播放器表的文件将我带到1066行。
注意1064行上的<!----这意味着该表实际上被注解掉了,这就是为什么pandas没有“看到”它。

1064 <!--¬
1065 ¬
1066 <div class="table_container" id="div_stats_standard">¬                                                           1067 ¬

当你在你的“网络浏览器”中打开网页时,这些表格会被javascript取消注解。
您可以“手动”提取注解出的数据并将其传递给pandas:

import bs4
import requests
import pandas as pd

url = "https://fbref.com/en/comps/9/stats/Premier-League-Stats"

r = requests.get(url)
soup = bs4.BeautifulSoup(r.content, "html.parser")

table_id = """<div class="table_container" id="div_stats_standard">"""
table = (
   soup.find(attrs={"data-label": "Player Standard Stats"})
       .find_next(string=lambda tag: 
          isinstance(tag, bs4.element.Comment) and table_id in tag
   )
)

player_stats = pd.read_html(table)[0]
>>> player_stats
    Unnamed: 0_level_0   Unnamed: 1_level_0 Unnamed: 2_level_0  ... Per 90 Minutes          Unnamed: 36_level_0
                    Rk               Player             Nation  ...           npxG npxG+xAG             Matches
0                    1     Brenden Aaronson             us USA  ...           0.14     0.31             Matches
1                    2            Che Adams            sct SCO  ...           0.30     0.42             Matches
2                    3          Tyler Adams             us USA  ...           0.00     0.06             Matches
3                    4     Tosin Adarabioyo            eng ENG  ...           0.03     0.05             Matches
4                    5         Nayef Aguerd             ma MAR  ...           0.14     0.17             Matches
..                 ...                  ...                ...  ...            ...      ...                 ...
574                553        Jordan Zemura             zw ZIM  ...           0.02     0.14             Matches
575                554  Oleksandr Zinchenko             ua UKR  ...           0.06     0.12             Matches
576                555         Hakim Ziyech             ma MAR  ...           0.08     0.35             Matches
577                556           Kurt Zouma             fr FRA  ...           0.10     0.11             Matches
578                557      Martin Ødegaard             no NOR  ...           0.31     0.54             Matches

[579 rows x 37 columns]

相关问题