web-dev-qa-db-ja.com

PythonでのHTTP応答の解析

[〜#〜] this [〜#〜] urlで情報を操作したい。正常に開き、内容を読むことができます。しかし、私が本当にやりたいことは、必要のないものをすべて捨て、保持したいものを操作することです。

文字列を辞書に変換して、繰り返し処理できる方法はありますか?または、そのまま(strタイプ)解析する必要がありますか?

from urllib.request import urlopen

url = 'http://www.quandl.com/api/v1/datasets/FRED/GDP.json'
response = urlopen(url)

print(response.read()) # returns string with info
29
Colton Allen

response.read()を印刷したときに、bが文字列の前に付けられていることに気付きました(例__b'{"a":1,.._)。 「b」はバイトを表し、処理しているオブジェクトのタイプの宣言として機能します。 json.loads('string')を使用して文字列をdictに変換できることを知っていたので、バイト型を文字列型に変換する必要がありました。これを行うには、utf-8 decode('utf-8')への応答をデコードしました。文字列型になると、私の問題は解決し、dictを簡単に反復処理できました。

これが最速であるか、それとも最も「Python的な」方法で書かれているかはわかりませんが、機能し、常に最適化と改善の時間が経ちます。私のソリューションの完全なコード:

_from urllib.request import urlopen
import json

# Get the dataset
url = 'http://www.quandl.com/api/v1/datasets/FRED/GDP.json'
response = urlopen(url)

# Convert bytes to string type and string type to dict
string = response.read().decode('utf-8')
json_obj = json.loads(string)

print(json_obj['source_name']) # prints the string with 'source_name' key
_
62
Colton Allen

代わりにpythonの要求ライブラリを使用することもできます。

import requests

url = 'http://www.quandl.com/api/v1/datasets/FRED/GDP.json'    
response = requests.get(url)    
dict = response.json()

これで、「dict」をpython辞書のように操作できます。

10
Shaurya Mittal

jsonは、Python 3(JSON形式自体はUnicodeテキストに関してのみ定義されます)のUnicodeテキストで動作するため、HTTP応答で受信したバイトをデコードする必要があります。 r.headers.get_content_charset('utf-8') 文字エンコーディングを取得します:

#!/usr/bin/env python3
import io
import json
from urllib.request import urlopen

with urlopen('https://httpbin.org/get') as r, \
     io.TextIOWrapper(r, encoding=r.headers.get_content_charset('utf-8')) as file:
    result = json.load(file)
print(result['headers']['User-Agent'])

ここでio.TextIOWrapperを使用する必要はありません:

#!/usr/bin/env python3
import json
from urllib.request import urlopen

with urlopen('https://httpbin.org/get') as r:
    result = json.loads(r.read().decode(r.headers.get_content_charset('utf-8')))
print(result['headers']['User-Agent'])
7
jfs

python 3.4で状況が変わったと思います。

print("resp:" + json.dumps(resp.json()))
0
Ajay Gautam