2016-01-31 54 views
11

我將如何解析用python的json api響應? 我現在有這樣的:Python 3獲取並解析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)) 

我得到這個錯誤: 類型錯誤:JSON對象必須str的,而不是「字節」

什麼是對付JSON的API的Python的方式?

回答

19

版本1:(做一個PIP導入模塊之前安裝請求)

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

第2版:(在導入模塊前做一個pip安裝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) 
3

我通常會使用requests包與json包。下面的代碼應爲您的需要是合適的:

輸出

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

使用要求最真的最容易使用的解決了這一點。 – ferdy

+0

我正在使用Python 3.5並出現錯誤: AttributeError:模塊的'requests'沒有屬性'get' 有關如何解決此問題的任何想法? – ClickThisNick

+0

你可能沒有安裝它 - 嘗試從命令行運行'pip install requests' – gtlambert

13

您可以使用標準庫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