Данные в json являются динамическими, что означает, что они помещают их в HTML.
Для доступа к ним с помощью BS вам необходимо получить доступ к var
, содержащемуся в источнике, который содержит данные json.затем загрузите его в 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'])