web-dev-qa-db-ja.com

Python 3 JSON APIの取得と解析

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オブジェクトは 'bytes'ではなくstrでなければなりません

JSON APIを処理するPythonの方法は何ですか?

31
ClickThisNick

バージョン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)
42
ferdy

標準ライブラリ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
31
mimin0

通常、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]
5
gtlambert

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())
0
kartik

元の質問に欠けている唯一のものは、応答オブジェクトの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', lamda o: SimpleNamespace(**o)) # '{ "id": 1, "$key": 13213654 }'
print(data.id) # 1
print(data.$key) # invalid syntax
0
Jacques