【问题标题】:Python requests.get not returning all elements from websitePython requests.get 不返回网站的所有元素
【发布时间】:2021-12-06 18:33:57
【问题描述】:

我正在尝试从这个网站获取球员的赛程,但是当我使用 requests.get 时,它没有返回任何结果。

r = requests.get("http://www.fplstatistics.co.uk/")
soup = BeautifulSoup(compiled.sub("",r.text),'lxml')
allFixtures = soup.find("span", {"class": "dtr-data"})
return allFixtures

【问题讨论】:

  • 我在网站上没有看到课程dtr-data
  • 上面写着 莱斯特(H) 伯恩利(A) 诺维奇(H) 纽卡斯尔(A)
  • 1.我使用您提供的文本找到了标签,但没有 class。 2. 你到底想要什么数据?整个表还是只是名称?
  • 只是灯具的名称。我希望它返回“莱斯特(H)伯恩利(A)诺维奇(H)纽卡斯尔(A)”
  • 我发现该站点正在动态呈现,可能需要selenium 或api端点。

标签: python html web-scraping beautifulsoup python-requests


【解决方案1】:

您需要的信息不包含在从您的 URL 返回的 HTML 中。浏览器构造另一个调用以通过 javascript 获取此信息(请求不支持)。

通过使用浏览器的开发人员工具进行观察,您可以看到请求以 JSON 形式返回的数据。

不幸的是,它用来获取此信息的 URL 需要一些信息,这些信息隐藏在 HTML 内的脚本部分之一中。所需的键和值都使用HEX格式(如果你搜索HTML,你会找到它)。

正则表达式可用于提取进行调用所需的键和值。有了这个,可以进行第二次请求调用以获取 JSON(与浏览器相同的方式)。我建议您将其打印出来,以便查看返回的所有信息的结构。

以下应该有效:

import requests
import re

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36"}
s = requests.Session()
req_main = s.get("http://www.fplstatistics.co.uk/", headers=headers)

k = re.search(r'"\\x6E\\x61\\x6D\\x65":"(.*?)"', req_main.text).group(1)
v = re.search(r'"\\x76\\x61\\x6C\\x75\\x65":(.*?)}', req_main.text).group(1)

url_json = f"http://www.fplstatistics.co.uk/Home/AjaxPricesIHandler?{k}={v}&pyseltype=0"
req_json = s.get(url_json, headers=headers)
fixtures = [fixture[-1] for fixture in req_json.json()["aaData"]]

for fixture in fixtures:
    print(fixture)

给你输出开始:

Aston Villa(H) Leicester(A) Watford(H) Liverpool(A) 
Aston Villa(H) Leicester(A) Watford(H) Liverpool(A) 
Aston Villa(H) Leicester(A) Watford(H) Liverpool(A)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    相关资源
    最近更新 更多