1

StackExchange API(検索エンドポイント)のURLを開き、結果を解析したいと思います[0]。ドキュメントには、すべての結果がJSON形式であると記載されています[1]。このURLをWebブラウザーで開くと、結果はまったく問題ありません[2]。ただし、Pythonプログラムを使用して開こうとすると、解析できないエンコードされたテキストが返されます。これがスニップです

á¬ôŸ?ÍøäÅ€ˆËç?bçÞIË
¡ëf)j´ñ‚TF8¯KÚpr®´Ö©iUizEÚD +¦¯÷tgNÈÑ.G¾LPUç?Ñ‘Ù~]ŒäÖÂ9Ÿð1£µ$JNóa?Z&Ÿtž'³Ðà#Í°¬õÅj5ŸE÷*æJî”Ï>íÓé’çÔqQI’†ksS™¾þEíqÝýly

URLを開くための私のプログラムは次のとおりです。私は特に間違っていることは何ですか?

''' Opens a URL and returns the result '''
def open_url(query):
    request = urllib2.Request(query)
    response = urllib2.urlopen(request)
    text = response.read()
    #results = json.loads(text)
    print text


title = openRawResource, AssetManager.AssetInputStream throws IOException on read of larger files


page1_query = stackoverflow_search_endpoint % (1,urllib.quote_plus(title),access_token,key)

[0] https://api.stackexchange.com/2.1/search/advanced?page=1&pagesize=100&order=desc&sort=relevance&q=openRawResource%2C+AssetManager.AssetInputStream+throws+IOException+on+read+of+larger+files&site = stackoverflow&access_token = ******&key = ******

[1] https://api.stackexchange.com/docs

[2] http://hastebin.com/qoxaxahaxa.sm

ソウルション

私は解決策を見つけました。これがあなたがそれをする方法です。

request = urllib2.Request(query)
request.add_header('Accept-encoding', 'gzip')
response = urllib2.urlopen(request)
if response.info().get('Content-Encoding') == 'gzip':
    buf = StringIO( response.read())
    f = gzip.GzipFile(fileobj=buf)
    data = f.read()
    result = json.loads(data)

大きすぎるため、完全な出力を投稿できません。解凍とリクエストのヘッダーの設定について指摘してくれたEvertとKristapsに感謝します。さらに、別の同様の質問を調べたいと思うでしょう[3]。

[3] python urllib2は、Webページからフェッチされたgzipデータを自動的に解凍しますか?

4

2 に答える 2

2

ドキュメントの次の段落には次のように書かれています。

さらに、すべてのAPI応答が圧縮されます。Content-Encodingヘッダーは常に設定されていますが、一部のプロキシはこれを取り除きます。API応答をデコードする適切な方法は、ここにあります。

出力は圧縮されているように見えます。ブラウザは(Content-Encodingに応じて)データを自動的に解凍するため、ヘッダーを確認して同じことを行う必要がありますresults = json.loads(zlib.decompress(text))

hereリンクも確認してください。

于 2012-10-01T11:27:56.940 に答える
1

私は解決策を見つけました。これがあなたがそれをする方法です。

request = urllib2.Request(query)
request.add_header('Accept-encoding', 'gzip')
response = urllib2.urlopen(request)
if response.info().get('Content-Encoding') == 'gzip':
    buf = StringIO( response.read())
    f = gzip.GzipFile(fileobj=buf)
    data = f.read()
    result = json.loads(data)

大きすぎるため、完全な出力を投稿できません。解凍とリクエストのヘッダーの設定について指摘してくれたEvertとKristapsに感謝します。さらに、別の同様の質問を調べたいと思うでしょう[1]。

[1] python urllib2は、Webページからフェッチされたgzipデータを自動的に解凍しますか?

于 2012-10-01T12:00:44.450 に答える