我写馈送一个搜索词使用谷歌搜索API和下载前10个结果到google Python程序。我是能够做到这一点在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

有帮助吗?

解决方案

在对象通过的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"]

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

其他提示

您将需要解码的字节对象,如果你想与json.loads使用它

resultjson =  json.loads(results.read().decode())

文档还建议以通过编码参数到loads功能:

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

我认为伦纳特具有解释如何获得的编码类型。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top