将谷歌搜索结果转换为Python 3.1中的JSON格式

2 投票
2 回答
3419 浏览
提问于 2025-04-15 18:30

我正在写一个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"]

这样可能可以工作。(我没有测试过)。

撰写回答