JSON解码不适用于Python请求

biswetbf  于 5个月前  发布在  Python
关注(0)|答案(1)|浏览(79)

我无法将请求的响应解码为有用的格式。代码如下:

import json
import requests

url = "https://www.tsx.com/json/company-directory/search/tsx/%5EC?callback=jQuery17109078120971266259_1565471114746&_=1565481666704"

r = requests.get(url)

字符串
我试着从论坛上的想法修改这些变体,但我得到了以下错误消息:
文件“C:\Users\XXXXX\Anaconda3\lib\json\decoder.py”,第357行,在raw_decode中,从None引发JSONDecodeError(“Expecting value”,s,err.value)JSONDecodeError:Expecting value

r = requests.get(url).json()


json_data = json.loads(r.text)


没有成功.为了展示我试图解码的内容:这里是r.text的第一行输出:

In [71]: runfile('C:/python...)
b'jQuery17109078120971266259_1565471114739({"last_updated":1565340914,"length":158,"results":[{"symbol":"AUMB","name":"1911 Gold Corporation","instruments":[{"symbol":"AUMB","name":"1911 Gold Corporation"}]},{"symbol":"ALBS.P","name":"A-Labs Capital I Corp.","instruments":[{"symbol":"ALBS.P","name":"A-Labs Capital I Corp."}]},{"symbol":"ALAB.P","name":"A-Labs Capital II Corp.","instruments":[{"symbol":"ALAB.P","name":"A-Labs Capital II Corp."}]},...


旁注:我在Google Chrome开发者工具中的“网络”下找到了“AJAX”URL。这些努力是我无法使用传统的BS 4刮取网站和学习请求刮取AJAX内容的能力的结果,如果我可以使用AJAX内容这个术语的话。

ep6jt1vc

ep6jt1vc1#

错误的原因是因为请求文本实际上不是有效的json。它有一些额外的文本,这些文本是来自前端的jquery调用。
使用一点regex,你可以从你刚才展示的结果中提取json,并在python中作为json对象使用:

  • (?:jQuery[0-9_]*\()(.+)(?:\);),本质上意味着:
  • (?:jQuery[0-9_]*\()以jQuery开头,有一个可能带有下划线的大数字(非捕获);
  • (.+)之间的任何内容
  • (?:\);)以括号和分号结尾(非捕获)

这里的结果:

import json
import re

r = requests.get(url)
results = json.loads(re.findall('(?:jQuery[0-9_]*\()(.+)(?:\);)', r.text)[0])

results
Out[1]:
{'last_updated': 1565340925,
 'length': 197,
 'results': [{'symbol': 'CLIQ',
   'name': 'Alcanna Inc.',
   'instruments': [{'symbol': 'CLIQ', 'name': 'Alcanna Inc.'},
    {'symbol': 'CLIQ.DB', 'name': 'Alcanna Inc 31JA22Db'}]},
...

字符串

相关问题