获得KeyError异常,同时使用的urllib,urllib2的和JSON模块
import urllib,urllib2 try:
import json
except ImportError:
import simplejson as json
params = {'q': '207 N. Defiance St, Archbold, OH','output': 'json', 'oe': 'utf8'}
url = 'http://maps.google.com/maps/geo?' + urllib.urlencode(params)
rawreply = urllib2.urlopen(url).read()
reply = json.loads(rawreply)
print (reply['Placemark'][0]['Point']['coordinates'][:-1])
在执行此代码即时得到一个错误创建谷歌的地图API客户端:获得KeyError异常,同时使用的urllib,urllib2的和JSON模块
回溯(最近通话最后一个): 文件“C:/ Python27/Foundations_of_networking/search2.py“,第11行,在 print(reply ['Placemark'] [0] ['Point'] ['coordinates'] [: - 1]) KeyError:'Placemark'
如果有人知道解决方法,请帮助我。我只是python的新手。
回答:
如果只打印reply
你会看到这一点:
{u'Status': {u'code': 610, u'request': u'geocode'}}
您正在使用API的弃用版本。转到v3。看看this page顶部的通知。
我还没有这个API之前使用,但下面放倒我送行(从here拍摄):
New endpoint
The v3 Geocoder uses a different URL endpoint:
http://maps.googleapis.com/maps/api/geocode/output?parameters Where output can be specified as json or xml.
Developers switching from v2 may be using a legacy hostname — either maps.google.com, or maps-api-ssl.google.com if using SSL. You should migrate to the new hostname: maps.googleapis.com. This hostname can be used both over both HTTPS and HTTP.
尝试以下操作:
import urllib,urllib2 try:
import json
except ImportError:
import simplejson as json
params = {'address': '207 N. Defiance St, Archbold, OH', 'sensor' : 'false', 'oe': 'utf8'}
url = 'http://maps.googleapis.com/maps/api/geocode/json?' + urllib.urlencode(params)
rawreply = urllib2.urlopen(url).read()
reply = json.loads(rawreply)
if reply['status'] == 'OK':
#supports multiple results
for item in reply['results']:
print (item['geometry']['location'])
#always chooses first result
print (reply['results'][0]['geometry']['location'])
else:
print (reply)
上面我已经展示了两种方法访问结果的经度和纬度。 for
循环将支持返回多个结果的情况。第二个简单地选择第一个结果。请注意,无论哪种情况,我都会首先检查退货的status
以确保实际数据恢复。
如果您要访问的纬度和经度独立,你可以这样做是这样的:
# in the for loop lat = item['geometry']['location']['lat']
lng = item['geometry']['location']['lng']
# in the second approach
lat = reply['results'][0]['geometry']['location']['lat']
lng = reply['results'][0]['geometry']['location']['lng']
回答:
刚打印出来的原始的回复,看什么键它,然后访问键,如果你这样做:
print (reply["Status"]),
你会得到:
{u'code': 610, u'request': u'geocode'}
和你的整个JSON的样子这样的:
{u'Status': {u'code': 610, u'request': u'geocode'}}
所以如果你要访问的代码只是做:
print(reply["Status"]["code"])
回答:
当您试图访问对象上不存在的键时,会引发KeyError异常。
我打印响应文本中rawreply:
>>> print rawreply ... {
"Status": {
"code": 610,
"request": "geocode"
}
}
所以问题是,你没有收到预期的响应,有它在没有“标”键,等于是例外。
请在Google Maps API上查找代码610的含义,也许您没有做出正确的查询,或者您在访问之前必须先检查响应。
以上是 获得KeyError异常,同时使用的urllib,urllib2的和JSON模块 的全部内容, 来源链接: utcz.com/qa/259221.html