【问题标题】:Python 3 Get and parse JSON APIPython 3 获取和解析 JSON API
【发布时间】:2016-05-09 07:08:03
【问题描述】:

如何使用 python 解析 json api 响应? 我目前有这个:

import urllib.request
import json

url = 'https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty'

def response(url):
    with urllib.request.urlopen(url) as response:
        return response.read()

res = response(url)
print(json.loads(res))

我收到此错误: TypeError: JSON 对象必须是 str,而不是 'bytes'

pythonic 处理 json api 的方式是什么?

【问题讨论】:

    标签: python json python-3.x api


    【解决方案1】:

    版本 1:(在运行脚本之前执行 pip install requests

    import requests
    r = requests.get(url='https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty')
    print(r.json())
    

    版本 2:(在运行脚本之前执行 pip install wget

    import wget
    
    fs = wget.download(url='https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty')
    with open(fs, 'r') as f:
        content = f.read()
    print(content)
    

    【讨论】:

      【解决方案2】:

      你可以使用标准库python3:

      import urllib.request
      import json
      url = 'http://www.reddit.com/r/all/top/.json'
      req = urllib.request.Request(url)
      
      ##parsing response
      r = urllib.request.urlopen(req).read()
      cont = json.loads(r.decode('utf-8'))
      counter = 0
      
      ##parcing json
      for item in cont['data']['children']:
          counter += 1
          print("Title:", item['data']['title'], "\nComments:", item['data']['num_comments'])
          print("----")
      
      ##print formated
      #print (json.dumps(cont, indent=4, sort_keys=True))
      print("Number of titles: ", counter)
      

      输出将是这样的:

      ...
      Title: Maybe we shouldn't let grandma decide things anymore.  
      Comments: 2018
      ---- 
      Title: Carrie Fisher and Her Stunt Double Sunbathing on the Set of Return of The Jedi, 1982  
      Comments: 880
      ---- 
      Title: fidget spinner  
      Comments: 1537
      ---- 
      Number of titles:  25
      

      【讨论】:

        【解决方案3】:

        我通常会使用requests 包和json 包。以下代码应该适合您的需求:

        import requests
        import json
        
        url = 'https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty'
        r = requests.get(url)
        print(json.loads(r.content))
        

        输出

        [11008076, 
         11006915, 
         11008202,
         ...., 
         10997668,
         10999859,
         11001695]
        

        【讨论】:

        • 使用 requests 确实是最容易使用的解决方案。
        • 我正在使用 Python 3.5,但出现错误:AttributeError: module 'requests' has no attribute 'get' 关于如何解决此问题的任何想法?
        • 您可能没有安装它 - 尝试从命令行运行 pip install requests
        • 我试过这个,但我得到了错误:the JSON object must be str, not 'bytes'...知道为什么吗?
        • @pookie 尝试使用:print(json.loads(r.text)),您可以查看差异,只需使用:type(r.text) type(r.content)
        【解决方案4】:

        原始问题中唯一缺少的是对响应对象上的decode 方法的调用(即使这样,也不是针对每个python3 版本)。很遗憾没有人指出这一点,每个人都跳入了第三方库。

        仅使用标准库,用于最简单的用例:

        import json
        from urllib.request import urlopen
        
        
        def get(url, object_hook=None):
            with urlopen(url) as resource:  # 'with' is important to close the resource after use
                return json.load(resource, object_hook=object_hook)
        

        简单用例:

        data = get('http://url') # '{ "id": 1, "$key": 13213654 }'
        print(data['id']) # 1
        print(data['$key']) # 13213654
        

        或者,如果您愿意,但风险更大:

        from types import SimpleNamespace
        
        data = get('http://url', lambda o: SimpleNamespace(**o)) # '{ "id": 1, "$key": 13213654 }'
        print(data.id) # 1
        print(data.$key) # invalid syntax
        # though you can still do
        print(data.__dict__['$key'])
        

        【讨论】:

          【解决方案5】:

          使用 Python 3

          import requests
          import json
          
          url = 'http://IP-Address:8088/ws/v1/cluster/scheduler'
          r = requests.get(url)
          data = json.loads(r.content.decode())
          

          【讨论】:

          • import requests
          • import json sn-p 应该作为复制和粘贴。否则很好简洁的答案
          猜你喜欢
          • 1970-01-01
          • 2023-03-22
          • 2013-07-06
          • 2021-02-22
          • 1970-01-01
          • 2015-07-11
          • 1970-01-01
          • 2023-04-10
          • 2020-09-08
          相关资源
          最近更新 更多