【问题标题】:Python web scraping a table with filtersPython web 使用过滤器抓取表格
【发布时间】:2019-10-24 18:37:35
【问题描述】:

我在网络抓取表格时难以提取文本,我认为应该归咎于页面上的过滤器。我尝试隔离所有“tr”和“th”元素,但似乎无法将底层文本导入 Python。我做错了什么?

我的代码:

from bs4 import BeautifulSoup
import requests

page_link ='https://www.ersteliga.hu/stats#/players/1945/regular/points'

page = requests.get(page_link)
html = page.content
soup = BeautifulSoup(html, 'html.parser')

my_table = soup.find_all('table', class_= "IHD-TABLE")
columns = my_table.find('th')

我希望输出包含在线看到的文本值,但我似乎得到的输出看起来与网页上的 HTML 不同。

【问题讨论】:

  • 该表是使用 Angular 动态生成的。您需要使用可以解析 Javascript 的东西来获取这些值,例如 Selenium。
  • 您的表格是异步填充的,当您下载页面时表格是空的。检查 js ajax 调用。

标签: python python-3.x web-scraping python-requests


【解决方案1】:

数据来自另一个 xhr 请求,您可以在网络选项卡中找到该页面。它返回 json。

import requests
import pandas as pd

headers = {
    'referer': 'https://www.ersteliga.hu/stats',
    'user-agent': 'Mozilla/5.0'
}
data = {'championshipId': '1945', 'division': 'Alapszakasz','type': 'playerStatsChampionShipPeriod'}
r = requests.post('https://www.ersteliga.hu/ajax/CallWS', headers = headers, data=data).json()
df = pd.DataFrame([i for i in r['d']], columns = list(r['d'][0].keys()))
print(df)

point 列 desc 上排序以获得与页面上相同的顺序

print(df.sort_values(['point'], ascending=[False]))

【讨论】:

  • 对于“数据”变量,您是如何找到字段名称(例如“类型”)及其可能值的,以便我可以查找其他数据?再次感谢您!
  • 在使用 F5 刷新页面时,我在开发工具 F12 中检查了 Web 流量。如果您访问我的个人资料页面,会有一些链接向您展示如何使用它来查找动态内容。
猜你喜欢
  • 2020-09-02
  • 2021-04-13
  • 2020-04-02
  • 1970-01-01
  • 2020-03-17
  • 2020-11-15
  • 1970-01-01
  • 2016-01-31
相关资源
最近更新 更多