在脚本标记内解析json var

nad*_*rmx 5 python lxml

我正在尝试刮掉后面的json输出 'https://sports.bovada.lv/soccer/premier-league'

它有一个来源如下

<script type="text/javascript">var swc_market_lists = {"items":[{"description":"Game Lines","id":"23", ... </script>
Run Code Online (Sandbox Code Playgroud)

我正在尝试获取swc_market_listsvar 的内容

现在我遇到的问题是,当我使用以下代码时

import requests
from lxml import html



url = 'https://sports.bovada.lv/soccer/premier-league'
r = requests.get(url)
tree = html.fromstring(r.content)
var = tree.xpath('//script')
print(var)
Run Code Online (Sandbox Code Playgroud)

我得到一个空的var值.

我也试过保存r.text并查看它,但我没有在那里看到脚本标签.

我错过了什么?

ale*_*cxe 8

您需要传递User-Agent标题才能使其正常工作:

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"})
Run Code Online (Sandbox Code Playgroud)

要获得所需script,您可以检查swc_market_lists文本中是否存在:

script = tree.xpath('//script[contains(., "swc_market_lists")]/text()')[0]
print(script)
Run Code Online (Sandbox Code Playgroud)

要提取swc_market_lists变量值:

import re

data = re.search(r"var swc_market_lists = (.*?);$", script).group(1)
print(data)
Run Code Online (Sandbox Code Playgroud)

然后,为了便于使用它,将其加载json.loads()到Python字典中:

import json
data = json.loads(data)
Run Code Online (Sandbox Code Playgroud)