【问题标题】:python api Can't load Str with Json.load()python api无法使用Json.load()加载Str
【发布时间】:2018-12-17 08:39:51
【问题描述】:

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

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

当我打印 source 时,它​​会在字符串的前面显示 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()

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

【问题讨论】:

    标签: python json python-3.x urllib2


    【解决方案1】:

    您收到此错误是因为响应是 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 对象之前提取 JSON。


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

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

    【讨论】:

    • 哇!感谢您的快速回复,我得开始挖掘 HTML 文档了……因为我可以通过 data = requests.get(url).json() 获取数据,这是否意味着请求包在后台执行这些操作?
    • 也许吧。查看requests 包中的代码。另外,如果您喜欢我的回答,我不介意点赞:)
    【解决方案2】:

    您收到错误消息,因为来自服务器的响应是正常的 HTML,而您要查找的数据位于 &lt;pre&gt; 标记内。在发出请求时,您必须提取 &lt;pre&gt; 标记的内容或包含适当的标头。

    来自 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'
    

    【讨论】:

    • 谢谢!!所以通过添加 .json 我基本上是在告诉网站我想要数据的特定部分?还是取决于网站?
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2020-09-29
      • 1970-01-01
      • 2019-06-27
      • 2020-05-18
      • 2022-01-23
      • 1970-01-01
      • 2022-01-02
      • 2020-07-28
      • 1970-01-01
      相关资源
      最近更新 更多