2016-01-31 13 views
11

Jak przeanalizuję odpowiedź json api z pythonem? Obecnie mam to:Python 3 Pobierz i przeanalizuj 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)) 

Dostaję taki błąd: TypeError: obiekt JSON należy STR, a nie 'bajty'

Jaki jest pythonic sposobem radzenia sobie z apis json?

Odpowiedz

19

Wersja 1: (do pip zainstalować żądań przed importowaniem moduł)

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

wersja 2 : (wykonaj instalację pip wget przed zaimportowaniem modułu)

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

Zwykle korzystam z pakietu requests z pakietem json. Poniższy kod powinien być odpowiedni do swoich potrzeb:

Wyjście

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

za pomocą żądań jest naprawdę najbardziej najłatwiejsze w użyciu rozwiązanie do tego. – ferdy

+0

Używam Pythona 3.5 i otrzymuję komunikat o błędzie: AttributeError: moduł 'requests' nie ma atrybutu 'get' Jakieś pomysły na rozwiązanie tego problemu? – ClickThisNick

+0

Być może nie zainstalowałeś go - spróbuj uruchomić 'pip install requests' z wiersza poleceń – gtlambert

13

można użyć standardowego python3 Biblioteka:

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) 

wyjście będzie jak ten:

... 
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