我正在编写一个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
答案 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"]
可能会工作。 (我没有测试过。)