"HTTPResponse"对象没有属性"decode"。

5

当我尝试运行下面的代码时,最初会收到以下错误:

Error:-the JSON object must be str, not 'bytes' 

import urllib.request
import json
search = '230 boulder lane cottonwood az'
search = search.replace(' ','%20')
places_api_key = 'AIzaSyDou2Q9Doq2q2RWJWncglCIt0kwZ0jcR5c'
url = 'https://maps.googleapis.com/maps/api/place/textsearch/json?query='+search+'&key='+places_api_key
json_obj = urllib.request.urlopen(url)
data = json.load(json_obj)
for item in  data ['results']:
     print(item['formatted_address'])
     print(item['types'])

在进行一些故障排除更改后, 例如:

 json_obj = urllib.request.urlopen(url)
 obj = json.load(json_obj)
 data = json_obj .readall().decode('utf-8')

 Error - 'HTTPResponse' object has no attribute 'decode'

我遇到了上述错误,我尝试过stackoverflow上的多个帖子,但似乎都不起作用。如果有人能让它工作,我会非常感激,我已经上传了整个可工作的代码。我不明白的是为什么其他人可以正常运行,而我却不行。 谢谢!

1个回答

18

urllib.request.urlopen 返回一个 HTTPResponse 对象,它无法直接进行 JSON 解码(因为它是一个字节流)。

因此你需要使用:

# Convert from bytes to text
resp_text = urllib.request.urlopen(url).read().decode('UTF-8')
# Use loads to decode from text
json_obj = json.loads(resp_text)

然而,如果你打印resp_text,你会注意到它实际上是xml,因此你需要一个xml阅读器:

resp_text = urllib.request.urlopen(url).read().decode('UTF-8')
(Pdb) print(resp_text)
<?xml version="1.0" encoding="UTF-8"?>
<PlaceSearchResponse>
  <status>OK</status>
...

更新(Python3.6+)

在Python3.6+中,json.load可以处理字节流(而json.loads可以处理字节字符串)。

现在这是有效的:

json_obj = json.load(urllib.request.urlopen(url))

我尝试了以下代码: json_obj = urllib.request.urlopen(url).read().decode('UTF-8') data = json.load(json_obj) 现在它报错: 'str' object has no attribute 'decode' - Uasthana
1
我是个傻瓜,使用了错误的URL,但是多亏了@Anthony Sottile的帮助,我已经修复了它。 - Uasthana
嘿 @Uasthana,你是怎么解决“str object has no object read”错误的?我也遇到了同样的错误。我的URL是正确的,为什么会出现这个错误呢? - rohit nair
@Uasthana 我之前使用的是 json.load() 而不是 loads()。更改后问题自动解决了。虽然我的工作已经完成,但我仍然无法理解 loads() 相对于 load 的神奇之处。谢谢! - rohit nair
loads 是指“从字符串中加载”,而 load 是指“从文件中加载”。 - anthony sottile
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接