python api 无法使用 Json.load() 加载 Str

python api Can't load Str with Json.load()

我刚开始在 python 中学习 json 并开始练习从网站上获取比特币价格;但是,我不断收到此错误:

''Exception Value: Expecting value: line 1 column 1 (char 0)''

当我打印 source 时,它​​在字符串的前面显示 b'。在网上浏览后,我认为这是关于字节和 str 东西的问题(也从在线网站检查 json 格式确实是正确的)。我的代码如下:

import json
import urllib.request

url = 'http://www.quandl.com/api/v3/datasets/BCHARTS/BITSTAMPUSD'

with urllib.request.urlopen(url) as response:
    source = response.read().decode('utf-8')
data = json.loads(source)

目前,我切换到

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

并且运行顺利,但我仍然希望修复上述错误。 提前致谢!

您收到此错误是因为响应采用 HTML 格式。不是 JSON 格式。

你可以把source变量打印出来看看。

实际 JSON 在 <code> 标签内:

<html class="gr__quandl_com"><head>
<head>...</head>
<body>
    <pre>
        <code>
        {...}             #Here is the actual JSON.
        </code>
    </pre>
</body>

您可以使用 beautifulsoup 等库来解析 HTML 并在创建 JSON object.

之前提取 JSON

或者,您可以要求服务器以 [​​=29=] 格式发送响应,方法是在发出请求时添加以下 header:

request.add_header('Accept', 'application/json') 

您收到错误消息,因为服务器的响应是正常的 HTML 并且您要查找的数据位于 <pre> 标记内。您必须在提出请求时提取 <pre> 标记的内容或包含适当的 headers。

From quandl API docs
Change Formats You can get the same data in JSON format:

https://www.quandl.com/api/v3/datasets/OPEC/ORB.json
Or in XML: https://www.quandl.com/api/v3/datasets/OPEC/ORB.xml

所以你的情况是:

url = 'http://www.quandl.com/api/v3/datasets/BCHARTS/BITSTAMPUSD.json'

您需要告诉服务器,您想要 JSON 格式的响应。目前你得到 HTML.

import json 
import urllib.request 

url = 'http://www.quandl.com/api/v3/datasets/BCHARTS/BITSTAMPUSD' 
request = urllib.request.Request(url) 
request.add_header('Accept', 'application/json') 
with urllib.request.urlopen(request) as response: 
     source = response.read().decode('utf-8') 
data = json.loads(source)