首页 > 解决方案 > Python 中的网页抓取 - Understat.com

问题描述

我正在尝试网页抓取https://understat.com/league/EPL并抓取页面上的表格,其中包含团队列表和与每个团队相关的数据,但它没有奏效,我收到一个错误“NoneType”对象是可调用的。

这是我尝试过的代码(我是新手,非常感谢您的帮助):

from bs4 import beautifulsoup
import requests
import pandas as pd

result = requests.get ("https://understat.com/league/EPL")
src = result.content
soup = BeautifulSoup(src, 'html.parser')
columns = ("No", "Team", "M", "W", "D", "L", "G", "GA", "Pts", "xG", "xGA", "xPts")
df = pd.DataFrame(columns=columns)

for row in soup ("table", {"class":"calendar-container}).find_all("tr"):
    tds=row.find_all("td")
    row=(td.text.replace("\n", "") for td in tds)
    df = df.append(pd.Series(row, index=columns), ignore_index=True

标签: pythonweb-scraping

解决方案


该页面正在由 javascript 呈现。如果您在浏览器中查看源代码,您会看到所有数据都在名为 datesData 和 playerdata 的 javacript 变量中。查看此答案,了解获取 javascript 呈现页面的两种不同方法:Not able to extract nested table body with pandas from pages 。

这里的另一个选择是对变量使用正则表达式,然后使用 JSON 模块对其进行解析。

import json
import re

patt = re.compile(r'pattern for script variable you want')
src = result.content
match = re.search(patt, src)
if match:
    var = json.loads(match.group(1))

推荐阅读