【问题标题】:Python urllib2: Receive JSON response from urlPython urllib2:从 url 接收 JSON 响应
【发布时间】:2012-12-05 00:09:09
【问题描述】:

我正在尝试使用 Python 获取 URL,响应为 JSON。但是,当我运行时

import urllib2
response = urllib2.urlopen('https://api.instagram.com/v1/tags/pizza/media/XXXXXX')
html=response.read()
print html

html 是 str 类型,我期待的是 JSON。有什么方法可以将响应捕获为 JSON 或 python 字典而不是 str。

【问题讨论】:

  • response.read() 是否返回了有效的 JSON 字符串?
  • 是的,它是一个有效的 JSON 字符串,它只是或类型 str 而不是 dict
  • 如果是字符串的 JSON 表示,而不是对象(dict)的 JSON 表示,则不能强制服务器返回不同的数据;您可能需要提出不同的请求。如果只是不知道如何将 JSON 表示解析为等效的 Python 对象,Martjin Pieters 的答案是正确的。

标签: python json urllib2


【解决方案1】:

如果 URL 返回有效的 JSON 编码数据,请使用 json library 对其进行解码:

import urllib2
import json

response = urllib2.urlopen('https://api.instagram.com/v1/tags/pizza/media/XXXXXX')
data = json.load(response)   
print data

【讨论】:

  • @ManuelSchneid3r:这里的答案是针对 Python 2,从 response 读取会为您提供字节串,json.load() 期望读取字节串。 JSON必须使用 UTF 编解码器进行编码,并且上述方法适用于 UTF-8、UTF-16 和 UTF-32,前提是后两种编解码器包含 BOM 代码点。您链接到的答案假定使用了 UTF-8,这通常是正确的,因为这是默认设置。从 Python 3.6 开始,json 库使用 JSON 数据自动解码字节码,前提是使用 UTF 编码。
  • @ManuelSchneid3r:否则我建议您使用 requests 库,它还会自动检测正确的 UTF 编解码器,以便在缺少 BOM 且未在响应标头中指定字符集的情况下使用.只需使用response.json() 方法。
【解决方案2】:
import json
import urllib

url = 'http://example.com/file.json'
r = urllib.request.urlopen(url)
data = json.loads(r.read().decode(r.info().get_param('charset') or 'utf-8'))
print(data)

urllib,用于 Python 3.4
HTTPMessage,由 r.info() 返回

【讨论】:

  • print data 以外的实体代码对于 Python 3 不正确。应该是 print(data)
  • 是的,第 2 行应该是 import urllib.request 。此外,网址中的 .json 文件不再存在。
【解决方案3】:
"""
Return JSON to webpage
Adding to wonderful answer by @Sanal
For Django 3.4
Adding a working url that returns a json (Source: http://www.jsontest.com/#echo)
"""

import json
import urllib

url = 'http://echo.jsontest.com/insert-key-here/insert-value-here/key/value'
respons = urllib.request.urlopen(url)
data = json.loads(respons.read().decode(respons.info().get_param('charset') or 'utf-8'))
return HttpResponse(json.dumps(data), content_type="application/json")

【讨论】:

  • 在 Django 1.7 + 的情况下,您可以直接使用 JsonResponse 如下from django.http import JsonResponse return JsonResponse({'key':'value'})
  • 我在做 json.dump() 而不是 json.dumps(),感觉很笨,谢谢救命!
【解决方案4】:

注意验证等,但直接的解决方案是:

import json
the_dict = json.load(response)

【讨论】:

    【解决方案5】:
    resource_url = 'http://localhost:8080/service/'
    response = json.loads(urllib2.urlopen(resource_url).read())
    

    【讨论】:

      【解决方案6】:

      Python 3 标准库单行:

      load(urlopen(url))
      
      # imports (place these above the code before running it)
      from json import load
      from urllib.request import urlopen
      url = 'https://jsonplaceholder.typicode.com/todos/1'
      

      【讨论】:

        【解决方案7】:

        您也可以使用requests 获取json,如下所示:

        import requests
        
        r = requests.get('http://yoursite.com/your-json-pfile.json')
        json_response = r.json()
        

        【讨论】:

          【解决方案8】:

          虽然我猜它已经回答了我想在此添加我的一点点

          import json
          import urllib2
          class Website(object):
              def __init__(self,name):
                  self.name = name 
              def dump(self):
               self.data= urllib2.urlopen(self.name)
               return self.data
          
              def convJSON(self):
                   data=  json.load(self.dump())
               print data
          
          domain = Website("https://example.com")
          domain.convJSON()
          

          注意:传递给 json.load() 的对象应该支持 .read() ,因此 urllib2.urlopen(self.name).read() 行不通。 在这种情况下,应为传递的域提供协议 http

          【讨论】:

            【解决方案9】:

            这是您问题的另一个更简单的解决方案

            pd.read_json(data)
            

            其中 data 是以下代码的 str 输出

            response = urlopen("https://data.nasa.gov/resource/y77d-th95.json")
            json_data = response.read().decode('utf-8', 'replace')
            

            【讨论】:

              【解决方案10】:

              此处提供的示例均不适合我。它们用于 Python 2 (uurllib2) 或用于 Python 3 的返回错误“ImportError: No module named request”。我用谷歌搜索错误消息,它显然需要我安装一个模块——这对于这样一个简单的任务显然是不可接受的。

              这段代码对我有用:

              import json,urllib
              data = urllib.urlopen("https://api.github.com/users?since=0").read()
              d = json.loads(data)
              print (d)
              

              【讨论】:

              • 您显然使用的是 Python 2。在 Python 3 中,没有urllib.urlopenurlopenurllib.request 模块中。
              猜你喜欢
              • 2012-08-18
              • 1970-01-01
              • 2013-08-26
              • 2015-09-01
              • 1970-01-01
              • 2011-11-26
              • 1970-01-01
              • 1970-01-01
              • 2013-03-04
              相关资源
              最近更新 更多