将谷歌搜索结果转换为Python 3.1中的JSON格式
我正在写一个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"]
谷歌的搜索API会把结果以json格式返回,所以我用上面的代码把结果下载到一个json文件里,然后把它解析成一个列表(betterResults)。
但是当我切换到Python 3时,我的程序开始出现错误。显然,在Python 2.6中,urlopen()返回的是一个类似文件的对象,可以直接加载到json中。而在Python 3.1中,返回的是一个HTTPResponse对象,虽然它有一个read()方法,符合json的要求,但它是一个字节对象。因此,我无法像在2.6中那样访问信息。
有没有办法访问谷歌返回的json?我该如何在Python 3中获取结果,并选择我想要的字段,就像我在json中做的那样?
非常感谢,
bsg
2 个回答
2
如果你想用 json.loads
来处理这个字节对象,你需要先把它解码。
resultjson = json.loads(results.read().decode())
文档里也建议 在调用 loads
函数时传入编码参数:
json.loads(results.read(), encoding=<encoding-type>)
我觉得Lennart有解释怎么获取编码类型。
1
通过urlopen得到的对象是类似文件的东西,你在这点上理解错了。不过你使用了json.loads(),它是需要一个字符串的。而json.load()是需要一个类似文件的对象。
但是,json.load()期望read()方法的结果是一个字符串,而你得到的read结果实际上是字节(bytes),所以你需要先把字节解码成字符串。
所以,可以像这样做:
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"]
这样可能可以工作。(我没有测试过)。