2

我正在编写一个 Python 程序,它使用谷歌搜索 API 向谷歌提供搜索词并下载前 10 个结果。我能够在 Python 2.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 对象,它确实包含一个 read() 方法,这是 json 规范所要求的,但它是一个字节对象。因此,我无法访问 2.6 中的信息。

有什么办法可以访问google返回的json?如何在 Python 3 中获得结果并能够选择我想要的字段,就像我对 json 所做的那样?

非常感谢,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 回答