将谷歌搜索结果转换为python 3.1中的json

时间:2010-01-26 22:35:12

标签: python json httpresponse google-search-api

我正在编写一个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对象,它根据json规范的要求包含一个read()方法,但它是一个字节对象。因此我无法访问2.6中的信息。

有没有办法访问谷歌返回的json?如何在Python 3中获得结果并能够选择我想要的字段,因为我能够使用json?

非常感谢,   BSG

2 个答案:

答案 0 :(得分:2)

如果要将字节对象与json.loads

一起使用,则需要对其进行解码
resultjson =  json.loads(results.read().decode())

docs also suggest将编码参数传递给loads函数:

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

我认为Lennart解释了如何获得编码类型。

答案 1 :(得分:1)

urlopen 返回的对象是文件,你错了。但是你使用json.loads(),它需要一个字符串。 json.load()需要一个像object这样的文件。

但是,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"]

可能会工作。 (我没有测试过。)