2

私は、グーグル検索APIを使用してグーグルに検索語を送り、最初の10件の結果をダウンロードするPythonプログラムを書いています。私は次のようにPython2.6でこれを行うことができました:

query = urllib.parse.urlencode({'q' : 'searchterm','start' : k},doseq=false)
url = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&%s' \
             % (query)
results = urllib.urlopen(url)
resultsjson = json.loads(results.read())
betterResults += resultsjson["responseData"]["results"]

Googleの検索APIは結果をjsonとして返すため、上記のコードを使用して結果を自分のjsonにダウンロードし、リスト(betterResults)に解析しました。

Python 3に切り替えたとき、私のプログラムは例外をスローし始めました。どうやら、Python 2.6では、urlopen()によって返されるオブジェクトは、jsonにロードできるファイルのようなオブジェクトです。Python 3.1では、返されるオブジェクトはHTTPResponseオブジェクトです。これには、json仕様で要求されているように、read()メソッドが含まれていますが、バイトオブジェクトです。そのため、2.6のときのように情報にアクセスできませんでした。

グーグルから返されたjsonにアクセスする方法はありますか?jsonで実行できたように、Python 3で結果を取得し、必要なフィールドを選択するにはどうすればよいですか?

どうもありがとうございました、bsg

4

2 に答える 2

2

バイトオブジェクトをで使用する場合は、デコードする必要がありますjson.loads

resultjson =  json.loads(results.read().decode())

ドキュメントでは、エンコーディングパラメータをloads関数に渡すことも提案しています。

json.loads(results.read(), encoding=<encoding-type>)

Lennartには、エンコーディングタイプを取得する方法についての説明があると思います。

于 2010-01-26T22:39:24.217 に答える
1

urlopenによって返されるオブジェクトファイルのようなものです、あなたはそこで間違っています。ただし、文字列を期待するjson.loads()を使用します。json.load()は、オブジェクトのようなファイルを想定しています。

ただし、json.load()は、read()メソッドの結果が文字列であることを想定していますが、もちろん、取得する読み取りはバイトになるため、最初にバイトから文字列にデコードする必要があります。

だから、このようなもの:

query = urllib.parse.urlencode({'q' : 'searchterm','start' : k},doseq=false)
url = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&%s' \
             % (query)
results = urllib.urlopen(url)
encoding = input.getheader('content-type').split('=')[-1]
resultsjson = json.loads(results.read().decode(encoding))
betterResults += resultsjson["responseData"]["results"]

うまくいくかもしれません。(私はそれをテストしませんでした)。

于 2010-01-26T22:50:21.033 に答える