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

时间:2018-12-17 08:39:51

标签: python json python-3.x urllib2

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

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

当我打印源代码时,它在字符串的前面显示b'。在线浏览后,我认为这是关于byte和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()

,并且工作正常,但我仍然希望修复上述错误。 预先感谢!

3 个答案:

答案 0 :(得分:0)

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

您可以打印source变量并进行查看。

实际的JSON位于<code>标记内:

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

在创建JSON对象之前,您可以使用beautifulsoup之类的库来解析HTML并提取JSON。


或者,您可以通过在请求时添加以下标头来要求服务器以JSON格式发送响应:

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

答案 1 :(得分:0)

您会收到错误消息,因为来自服务器的响应是普通HTML,而您要查找的数据位于<pre>标记内。发出请求时,您必须提取<pre>标记的内容或包括适当的标题。

  

来自quandl API文档
  变更格式   您可以使用JSON格式获取相同的数据:

     

https://www.quandl.com/api/v3/datasets/OPEC/ORB.json
  或使用XML:   https://www.quandl.com/api/v3/datasets/OPEC/ORB.xml

所以您的情况是:

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

答案 2 :(得分:0)

您需要告诉服务器,您想要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)