python - 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
解决方案
该页面正在由 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))
推荐阅读
- google-sheets - 当列 D 小于 C 的 50% 时,我如何让谷歌表格工作,并在发生这种情况时将颜色更改为琥珀色
- python - 如何根据 Pandas 中的条件为数据框子集的列分配值?
- android - 如何获得具有特定值的光标行
- java - 为什么我的选择设备活动不运行?
- javascript - 如何获取p元素内的所有跨度数据属性
- angular - 如何让 vsCode 意识到自动完成的深度依赖导入?
- database - 在 Postgresql 中从另一个更新大表需要很长时间(超过 6 小时)
- flutter - Flutter 安全存储更改路线
- javascript - 创建数组并组合键
- matlab - 如何在matlab中使用移动窗口计算梯度和相关系数?