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])
执行此代码时出现错误:
追踪(最近一次通话): 文件“C:/Python27/Foundations_of_networking/search2.py”,第11行,in print(回复['Placemark'] [0] ['Point'] ['coordinates'] [: - 1]) KeyError:'地标'
如果有人知道解决方案,请帮助我。我刚认识python。
答案 0 :(得分:3)
如果只打印reply
,您会看到:
{u'Status': {u'code': 610, u'request': u'geocode'}}
您使用的是已弃用的API版本。转到v3。请查看this page顶部的通知。
我之前没有使用过此API,但以下内容让我失望(摘自here):
新端点
v3 Geocoder使用不同的URL端点:
http://maps.googleapis.com/maps/api/geocode/output?parameters在哪里 输出可以指定为json或xml。
从v2切换的开发人员可能正在使用旧版主机名 如果使用SSL,maps.google.com或maps-api-ssl.google.com。你应该 迁移到新主机名:maps.googleapis.com。这个主机名可以 同时使用HTTPS和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']
答案 1 :(得分:0)
只需打印出原始回复,看看它有哪些按键,然后访问按键,如果你这样做:
print (reply["Status"]),
你会得到:
{u'code': 610, u'request': u'geocode'}
,你的整个JSON看起来像这样:
{u'Status': {u'code': 610, u'request': u'geocode'}}
所以,如果您想访问代码,请执行以下操作:
print(reply["Status"]["code"])
答案 2 :(得分:0)
当您尝试访问对象上不存在的键时,会引发KeyError异常。
我在rawreply中打印响应文本:
>>> print rawreply
... {
"Status": {
"code": 610,
"request": "geocode"
}
}
所以问题是你没有收到预期的响应,那里没有'Placemark'键,因此是例外。
查看Google Maps API上代码610的含义,也许您没有进行正确的查询,或者您必须在访问之前检查响应。