1
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 行,打印中(回复 ['Placemark'][0]['Point']['coordinates'][:- 1]) KeyError: '地标'

如果有人知道解决方案,请帮助我。我只是 python 的新手。

4

3 回答 3

3

如果你只打印,reply你会看到:

{u'Status': {u'code': 610, u'request': u'geocode'}}

您正在使用已弃用的 API 版本。移至 v3。看看这个页面顶部的通知。

我以前没有使用过这个 API,但以下提示我(取自这里):

新端点

v3 Geocoder 使用不同的 URL 端点:

http://maps.googleapis.com/maps/api/geocode/output?parameters其中输出可以指定为 json 或 xml。

从 v2 切换的开发人员可能正在使用旧主机名 — maps.google.com 或 maps-api-ssl.google.com(如果使用 SSL)。您应该迁移到新的主机名: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']
于 2013-07-25T19:58:54.217 回答
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"])
于 2013-07-25T19:52:28.943 回答
0

当您尝试访问对象上不存在的键时,会引发 KeyError 异常。

我在 rawreply 中打印响应文本:

>>> print rawreply
... {
      "Status": {
        "code": 610,
        "request": "geocode"
      }
    }

所以问题在于您没有收到预期的响应,那里没有“地标”键,因此是例外。

在 Google Maps API 上查找代码 610 的含义,也许您没有进行正确的查询,或者您必须在访问之前检查响应。

于 2013-07-25T19:56:39.880 回答