首页 > 解决方案 > JSON解码不适用于Python请求

问题描述

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

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 中引发 JSONDecodeError("Expecting value", s, err.value) from None 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”网址。这些努力是由于我无法使用传统的 BS4 抓取网站并了解请求能够抓取 AJAX 内容(如果我可以使用术语 AJAX 内容)。

标签: pythonjsonpython-requests

解决方案


错误的原因是请求文本实际上不是有效json格式。它有一些额外的文本,它们是来自前端的 jquery 调用。

只需一点点,regex您就可以从您刚刚呈现的结果中实际提取json,并将其用作 中的json对象python

  • (?: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'}]},
...

推荐阅读