【问题标题】:Using requests with bs4 and or json使用带有 bs4 和或 json 的请求
【发布时间】:2018-05-11 20:02:53
【问题描述】:

这是我正在寻找的页面的来源。 Page Source。 如果页面源在此处不起作用,则仅是源的链接。 "查看源代码:https://sports.bovada.lv/baseball/mlb"

这里是链接:Link to page

我不熟悉使用bs4,但下面的脚本可以运行,但没有返回我需要的任何内容。

import requests
from bs4 import BeautifulSoup

r = requests.get('https://sports.bovada.lv/baseball/mlb/game-lines-market-group')
soup = BeautifulSoup(r.content, 'lxml')

print(soup.prettify())

我可以返回 soup 就好了。但是从网站上看到的和返回的soup 是不一样的。

这是我从检查中看到的示例。

目标是移除球队、投手、赔率和总得分。我可以在检查版本中清楚地看到。当我printsoup那个信息不来的时候。

然后我再深入一点,在页面源代码的底部我可以看到一个 iFrame,在它下面看起来像 json 字典,其中包含我要提取的所有内容,但运行类似的脚本来检索 json 数据却没有像我希望的那样工作:

import requests

req = requests.get('view-source:https://sports.bovada.lv//baseball/mlb/game-lines-market-group')
data = req.json()['itemList']
print(data)

我相信我应该使用bs4,但我对为什么没有返回相同的html 感到困惑。

【问题讨论】:

  • 此信息由动态网页生成,即内容使用 Javascript 生成并取决于用户的选择。如果您解析 html,您将找不到数据,您会找到生成内容的 Javascript 代码。这并不意味着您不能访问数据,还有其他方法,但您可能不会在 html 源代码中找到它。您可以使用检查器查看标签,但这是因为检查器会动态呈现源代码。您可以使用 Inspector 并分析请求数据的位置。

标签: python python-3.x iframe beautifulsoup


【解决方案1】:

json 中的数据是动态的,这意味着它会将其放入 HTML。

要使用 BS 访问它,您需要访问包含 json 数据的源中包含的 var。然后将其加载到 json 中,您可以从那里访问它。

这是您在var swc_market_lists =提供的链接

所以在源代码中它看起来像

<script type="text/javascript">var swc_market_lists = {"items":[{"description":"Game Lines","id":"136","link":"/baseball/mlb/game-lines-market-group","baseLink":"/baseball/mlb/game-lines-market-........

现在您可以在pattern 正则表达式中使用swc_market_lists 来仅返回该脚本。

使用soup.find 仅返回该部分。

因为.text 将包含 var 部分,所以我从 json 字符串的开头返回了数据。在这种情况下来自24,这是第一个{

这意味着您现在拥有一串 JSON 数据,然后您可以将其加载为 json 并根据需要进行操作。

希望你能用这个找到你想要的东西

from bs4 import BeautifulSoup as bs4
import requests
import json
from lxml import html
from pprint import pprint

import re


def get_data():

    url = 'https://sports.bovada.lv//baseball/mlb/game-lines-market-group'
    r = requests.get(url, headers={"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.103 Safari/537.36"})
    html_bytes = r.text
    soup = bs4(html_bytes, 'lxml')

    # res = soup.findAll('script') # find all scripts..

    pattern = re.compile(r"swc_market_lists\s+=\s+(\{.*?\})")
    script = soup.find("script", text=pattern)

    return script.text[23:]

test1 = get_data()

json_data = json.loads(test1)

pprint(json_data['items']) 

【讨论】:

  • 哇,我不完全确定它发生了什么,但这让我得到了 json 数据。是否可以进一步分解您的脚本正在执行的操作?你刚刚搜索了json-var吗?
  • 我首先使用res = soup.findAll('script') 只返回脚本,但您可以搜索var 的源并将其放入模式中......
猜你喜欢
  • 1970-01-01
  • 2021-09-04
  • 2019-03-12
  • 2017-12-09
  • 2019-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多