HTTPResponse'对象没有属性'decode

Uas*_*ana 3 json urllib python-3.4

当我试图运行下面的代码时,我最初收到以下错误 -

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'])
Run Code Online (Sandbox Code Playgroud)

进行一些故障排除后的更改,如: -

 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'
Run Code Online (Sandbox Code Playgroud)

我收到上面的错误,我已经尝试了stackoverflow上的多个帖子似乎没什么用.我上传了整个工​​作代码,如果有人能让它工作,我将非常感激.我不明白的是,为什么同样的事情对别人而不是我有用.谢谢!

Ant*_*ile 12

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)
Run Code Online (Sandbox Code Playgroud)

但是,如果你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>
...
Run Code Online (Sandbox Code Playgroud)

更新(python3.6 +)

在python3.6 +中,json.load可以采用字节流(并且json.loads可以采用字节串)

这现在有效:

json_obj = json.load(urllib.request.urlopen(url))
Run Code Online (Sandbox Code Playgroud)