获得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

回到顶部