我刚刚开始学习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()
,并且工作正常,但我仍然希望修复上述错误。 预先感谢!
答案 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)