【问题标题】:Retrieve JSON data from get request python从获取请求python中检索JSON数据
【发布时间】:2021-02-08 14:04:59
【问题描述】:

我正在尝试接收 JSON 格式的数据,文档位于 -https://chargepoints.dft.gov.uk/api/help API。

但是当我运行它时

response = requests.get('http://chargepoints.dft.gov.uk/api/retrieve/registry/postcode/EC3A+7BR/limit/10/type/format/json/')
print(response)

它返回 。如何获取 JSON 格式的数据?

*EDIT 当我使用 response.json 我得到 <bound method Response.json of <Response [200]>> 而当我使用 response.json() 我得到 JSONDecodeError("Expecting value", s, err.value)

【问题讨论】:

    标签: python json api flask request


    【解决方案1】:

    当我使用response.json() 时,我得到JSONDecodeError("Expecting value", s, err.value)

    这基本上意味着响应内容不是有效的json。

    如何诊断这样的东西?

    在 Python 中,您可以检查未格式化的 response.content(属性,因此没有括号)并分析您看到的内容...但由于它是一个没有任何身份验证或任何内容的简单 GET,只需将 url 粘贴到浏览器中即可。

    这就是你得到的:

    <p:ChargeDevices xsi:schemaLocation="http://www.pod-point.com/cxns/NCR/1 National_Chargepoint_Registry.xsd ">
    <Scheme>
    <SchemeCode>NA</SchemeCode>
    <SchemeData>
    <OrganisationName>NA</OrganisationName>
    <Website>NA</Website>
    <TelephoneNo>NA</TelephoneNo>
    </SchemeData>
    ...
    

    这是 XML,不是 JSON。你可能想知道为什么你没有得到 JSON,而你在 url 中写了你的 /format/json/...

    查看API documentation 并在浏览器中对其进行测试,我终于意识到您的url 中的/type/ 部分没有一对。您从一个 json 示例中得到它,/type 是那里的端点名称。

    删除/type 部分,它可以工作:

    response = requests.get('http://chargepoints.dft.gov.uk/api/retrieve/registry/postcode/EC3A+7BR/limit/10/format/json/')
    print(response.json())
    

    API 写得很糟糕 - 使用 /option/value 格式使得这件事很难被发现(在 RESTful API 中,它应该是 option=value&option2=value2)... 仍然不是我见过的最糟糕的 api,但它是非常糟糕的设计,它没有为 /type/format/json 部分返回任何错误信息——要么它不知道“type”选项,要么“json”“option”没有提供任何值......

    【讨论】:

    • 感谢详细而简洁的回复 :) 起初我对文档感到困惑,但这一切都清楚了。
    • 我一直在使用 .json() 方法成功接收数据,但是我现在在使用相同的代码时遇到了一个新错误。 stackoverflow.com/questions/66890152/… - 而 URL 在浏览器中显示 JSON 数据。我很茫然..
    【解决方案2】:

    您可以通过获取response.json获取响应数据,也可以通过response.text获取原始文本 然后你可以使用json库轻松转换

    import json
    import requests
    
    def get_json_from_url(url):
        content = get_url(url)
        js = json.loads(content)
        return js
    
    
    def get_url(url):
        response = requests.get(url)
        content = response.content.decode('utf8')
        return content
    
    url='https://chargepoints.dft.gov.uk/api/help'
    json_content=get_json_from_url(url)
    

    【讨论】:

      【解决方案3】:

      您可以通过调用response.json()获取响应数据

      【讨论】:

      • *.json() - 这是一种方法,而不是像.content 这样的属性 :)
      • 当我这样做时,我得到 - >
      • @OfirGottesman 然后你在别的东西上调用它,而不是Response 对象。 response.json 是一种方法,在 Python2 兼容版本中。 requests.readthedocs.io/en/master - 请看第一个示例,在页面顶部...
      • @Stuey17 该评论证明了我的评论。 :) 但是对于您当前的问题:获得 200 但“期望值”意味着 API 返回非 json 数据。我会写一个答案,因为评论太长了
      猜你喜欢
      相关资源
      最近更新 更多
      热门标签