2017-06-18 23 views
0

私はthis codegolf problemを見ていましたが、代わりにpython solutionをとり、urllibを使ってみることにしました。私はurllibjsonを操作するためのsome sample codeを変更:ユニコードをStack Exchange APIのデコードできません

import urllib.request 
import json 

res = urllib.request.urlopen('http://api.stackexchange.com/questions?sort=hot&site=codegolf') 
res_body = res.read() 

j = json.loads(res_body.decode("utf-8")) 

これが与える:

➜ codegolf python clickbait.py 
Traceback (most recent call last): 
    File "clickbait.py", line 7, in <module> 
    j = json.loads(res_body.decode("utf-8")) 
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte 

あなたがに行く場合:http://api.stackexchange.com/questions?sort=hot&site=codegolfと "ヘッダー" の下をクリックし、それはcharset=utf-8言います。 urlopenでこれらの奇妙な結果を私に与えるのはなぜですか?

答えて

1

res_bodyはgzippedです。応答を解凍すると、デフォルトではurllibが処理されることはわかりません。

APIサーバーからの応答を解凍すると、データが得られます。

import urllib.request 
import zlib 
import json 

with urllib.request.urlopen(
    'http://api.stackexchange.com/questions?sort=hot&site=codegolf' 
    ) as res: 

    decompressed_data = zlib.decompress(res.read(), 16+zlib.MAX_WBITS) 
    j = json.loads(decompressed_data, encoding='utf-8') 

    print(j) 
関連する問題