使用bs4和/或json的请求

时间:2018-05-11 20:02:54

标签: python python-3.x iframe beautifulsoup

以下是我要寻找的页面的来源。 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看到的情况并不相同。

以下是我从检查中可以看到的样本。 inspect of page

目标是移除球队,投手,赔率和总跑数。我可以在检查版中清楚地看到。当print soup信息未附带时。

然后我进一步深入,在页面源的底部我可以看到一个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

1 个答案:

答案 0 :(得分: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-........

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

使用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'])