python - 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 内容)。
解决方案
错误的原因是请求文本实际上不是有效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'}]},
...
推荐阅读
- excel - Excel:基于文本和日期的 SUMIFS 方程
- sql - 如何对在交易级别存储的定价数据(或取消存储数据)运行汇总统计?
- python - 可以让我将动态整数列表与其他三个静态整数列表进行比较的数据结构?
- wpf - 如何在 WPF DependencyProperty 检索上设置断点?
- python - 如何修复python中正则表达式引发的这种类型错误?
- sorting - 如何在不声明新数据的情况下更改 (String, Int) 类型的元组的 Ord 实例?
- python - 什么是符号张量,为什么它们会抛出“使用 `steps_per_epoch` 参数”错误?
- django - 使用 django Visual Studio 创建数据库
- python - 用另一个不同大小的 Pandas 数据框减去
- python - 如何使用 pybind 传递 numpy 数组列表