2016-01-31 3 views
11

Как бы я проанализировал ответ json api с помощью python? настоящее время у меня это: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)) 

Я получаю эту ошибку: TypeError: объект JSON должен быть строка, не «байт»

Что такое вещий способ справиться с JSon APIs?

ответ

19

Версия 1: (сделать пип установить запросы перед импортом модуля)

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

Version 2 : (выполнить операцию установки 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: модуль 'request' не имеет атрибута '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 
Смежные вопросы