以下是我要寻找的页面的来源。 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
看到的情况并不相同。
目标是移除球队,投手,赔率和总跑数。我可以在检查版中清楚地看到。当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
。
答案 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'])