Python 3 获取和解析 JSON API
Posted
技术标签:
【中文标题】Python 3 获取和解析 JSON API【英文标题】:Python 3 Get and parse 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 的方式是什么?
【问题讨论】:
【参考方案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 应该作为复制和粘贴。否则很好简洁的答案以上是关于Python 3 获取和解析 JSON API的主要内容,如果未能解决你的问题,请参考以下文章
解析 json 文件以获取要插入 bigquery 的正确列