Json Python谷歌地图获得所有方向

时间:2018-01-09 13:06:34

标签: python json google-maps parsing

我试图使用谷歌地图api获得从A到B的路线,但是我遇到了一个愚蠢的错误,我自己无法修复,你的帮助将会被贬低。所以,这是我的代码

import googlemaps
from datetime import datetime
import pprint
import json

gmaps = googlemaps.Client(key='HIDDEN')
now = datetime.now()
directions_result = gmaps.directions("Sydney Olympic Park, New South Wales 2127, Australia",
                                 "Parramatta, NSW",
                                 mode="transit",
                                 departure_time=now)

for leg in directions_result[0]['legs']:
    startAddress = leg['start_address']
    print "Start Address:", startAddress
    endAddress = leg['end_address']
    print "End Address:", endAddress
    distance=leg['distance']['text']
    print "Distance:",distance
    duration=leg['duration']['text']
    print "Duration:",duration
    for step in leg['steps']:
        html_instructions = step['html_instructions']
        instr= step['distance']['text']
        instrtime=step['duration']['text']
        print html_instructions + " " +instr+ " " + instrtime
        #till here works fine
        for stepp in step['steps']:
            y=step['steps'][0]['html_instructions']# but I would like to get step['steps']['steps']['html_instructions'], but got  'list index must be int not str'
            print y
            #this loop runs 1 time and then gives an error

这是我得到的输出:

Start Address: Sydney Olympic Park NSW 2127, Australia
End Address: Parramatta NSW 2150, Australia
Distance: 11.1 km
Duration: 36 mins
Walk to Olympic Park Station 0.3 km 4 mins
Head <b>northeast</b> on <b>Dawn Fraser Ave</b> toward <b>Olympic Blvd</b> <-- This is the 1st passage of "for stepp in step['steps']:"
Head <b>northeast</b> on <b>Dawn Fraser Ave</b> toward <b>Olympic Blvd</b>
Train towards Lidcombe 3.4 km 6 mins
Traceback (most recent call last):
  File "getdirections.py", line 43, in <module>
    for stepp in step['steps']:
KeyError: 'steps'

看起来python第一次查找,找到它,打印它,然后查看另一次,但是找不到它并给出了这个错误,但是当条件不满足时循环应该退出。

这是我的json回复

[{u'bounds': {u'northeast': {u'lat': -33.8085175, u'lng': 151.0651324},
          u'southwest': {u'lat': -33.8496094, u'lng': 151.0012743}},
u'copyrights': u'Map data \xa92018 Google',
u'legs': [{u'arrival_time': {u'text': u'1:09pm',
                           u'time_zone': u'Australia/Sydney',
                           u'value': 1515463756},
         u'departure_time': {u'text': u'12:32pm',
                             u'time_zone': u'Australia/Sydney',
                             u'value': 1515461520},
         u'distance': {u'text': u'11.9 km', u'value': 11938},
         u'duration': {u'text': u'37 mins', u'value': 2236},
         u'end_address': u'Parramatta NSW 2150, Australia',
         u'end_location': {u'lat': -33.8146729, u'lng': 151.0012743},
         u'start_address': u'Sydney Olympic Park NSW 2127, Australia',
         u'start_location': {u'lat': -33.8484821, u'lng': 151.0651324},
         u'steps': [{u'distance': {u'text': u'0.2 km', u'value': 243},
                     u'duration': {u'text': u'3 mins', u'value': 198},
                     u'end_location': {u'lat': -33.849457,
                                       u'lng': 151.062759},
                     u'html_instructions': u'Walk to Dawn Fraser Ave before Edwin Flack Ave',
                     u'polyline': {u'points': u'~_rmEa|_y[Pn@bBpGz@|CPE'},
                     u'start_location': {u'lat': -33.8484821,
                                         u'lng': 151.0651324},
                     u'steps': [{u'distance': {u'text': u'0.2 km',
                                               u'value': 243},
                                 u'duration': {u'text': u'3 mins',
                                               u'value': 198},
                                 u'end_location': {u'lat': -33.849457,
                                                   u'lng': 151.062759},
                                 u'html_instructions': u'Head <b>southwest</b> on <b>Dawn Fraser Ave</b>',
                                 u'polyline': {u'points': u'~_rmEa|_y[Pn@bBpGz@|CPE'},
                                 u'start_location': {u'lat': -33.8484821,
                                                     u'lng': 151.0651324},
                                 u'travel_mode': u'WALKING'}],
                     u'travel_mode': u'WALKING'},
                    {u'distance': {u'text': u'11.2 km',
                                   u'value': 11179},
                     u'duration': {u'text': u'32 mins',
                                   u'value': 1920},
                     u'end_location': {u'lat': -33.8175958,
                                       u'lng': 151.0045742},
                     u'html_instructions': u'Bus towards Parramatta',
                     u'polyline': {u'points': u'bfrmEgm_y[OF?@l@rB_PjHC@iD|AUDi@Bi@CoAc@aAfDQdAGpAHlBCjADnAN\\`@TdHvCaA`Dq@fAy@fAiAx@qCvAoAdAe@n@{AnD?@k@|ASVBJENOHMIEQIIo@c@cAcAS?KKCYk@q@oAkAk@c@UEGO?Iw@k@AAcC}A{BaA_@KQ@IOyAc@gG}AQ?yAs@aBiA}AyAaAkBCEYi@C?OCKWmE~Dg@u@uAa@A?}@Uq@~DoCi@A?eAWm@zD?@cApEuBjMcCdOeB_@kIyBA?kHmB}AUcFa@}f@}CgJi@oH@_BEsBBe@FOPG\\cBjU?@?@{A~SA@?@{Bb[?@eAzN?BgAzNOtAYzA_A`DA@sAzEiB~E?@Qh@uArFeAxFGtA?BDlFXtPEtEMdDw@hI?D}@xJIhBXlI?Hp@rQ?@^rJ?@\\`LQvCKlBjBNfGvApA\\jBr@tBbAzAXNNxBl@B?tEdA@?x@TnCd@jHYd@Wn@y@h@_@xAc@Jh@Bd@Ez@IVANc@dAgBzD'},
                     u'start_location': {u'lat': -33.849457,
                                         u'lng': 151.062759},
                     u'transit_details': {u'arrival_stop': {u'location': {u'lat': -33.8175958,
                                                                          u'lng': 151.0045742},
                                                            u'name': u'Parramatta Station, Stand B3'},
                                          u'arrival_time': {u'text': u'1:03pm',
                                                            u'time_zone': u'Australia/Sydney',
                                                            u'value': 1515463381},
                                          u'departure_stop': {u'location': {u'lat': -33.849457,
                                                                            u'lng': 151.062759},
                                                              u'name': u'Dawn Fraser Ave before Edwin Flack Ave'},
                                          u'departure_time': {u'text': u'12:35pm',
                                                              u'time_zone': u'Australia/Sydney',
                                                              u'value': 1515461719},
                                          u'headsign': u'Parramatta',
                                          u'line': {u'agencies': [{u'name': u'State Transit Sydney',
                                                                   u'phone': u'011 61 13 15 00',
                                                                   u'url': u'http://transportnsw.info/'}],
                                                    u'color': u'#03a9f4',
                                                    u'name': u'Parramatta to Burwood via Sydney Olympic Park',
                                                    u'short_name': u'525',
                                                    u'text_color': u'#ffffff',
                                                    u'vehicle': {u'icon': u'//maps.gstatic.com/mapfiles/transit/iw2/6/bus2.png',
                                                                 u'local_icon': u'//maps.gstatic.com/mapfiles/transit/iw2/6/au-sydney-bus.png',
                                                                 u'name': u'Bus',
                                                                 u'type': u'BUS'}},
                                          u'num_stops': 27},
                     u'travel_mode': u'TRANSIT'},
                    {u'distance': {u'text': u'0.5 km', u'value': 516},
                     u'duration': {u'text': u'7 mins', u'value': 395},
                     u'end_location': {u'lat': -33.8146729,
                                       u'lng': 151.0012743},
                     u'html_instructions': u'Walk to Parramatta NSW 2150, Australia',
                     u'polyline': {u'points': u'~~kmEqatx[KIEJMTWh@OZMVMZEPELABARANQFI@E@[@E?A?A?CAAACAEGSN[NMFMDIBK@UBG@IAC?A?G?YDQBC@CBA@A@A@CBKJKFMDOBG@E?E?QACVIf@Kr@[xBSzA'},
                     u'start_location': {u'lat': -33.8175958,
                                         u'lng': 151.0045742},
                     u'steps': [{u'distance': {u'text': u'0.1 km',
                                               u'value': 123},
                                 u'duration': {u'text': u'1 min',
                                               u'value': 84},
                                 u'end_location': {u'lat': -33.8170114,
                                                   u'lng': 151.0034771},
                                 u'html_instructions': u'Head <b>northwest</b> on <b>Liverpool-Parramatta Transitway</b> toward <b>Church St</b>',
                                 u'polyline': {u'points': u'~~kmEqatx[KIEJMTWh@OZMVMZEPELABARAN'},
                                 u'start_location': {u'lat': -33.8175958,
                                                     u'lng': 151.0045742},
                                 u'travel_mode': u'WALKING'},
                                {u'distance': {u'text': u'52 m',
                                               u'value': 52},
                                 u'duration': {u'text': u'1 min',
                                               u'value': 33},
                                 u'end_location': {u'lat': -33.8165694,
                                                   u'lng': 151.0034844},
                                 u'html_instructions': u'Turn <b>right</b> onto <b>Church St</b>',
                                 u'maneuver': u'turn-right',
                                 u'polyline': {u'points': u'h{kmEwzsx[QFI@E@[@E?A?A?CAAACAEG'},
                                 u'start_location': {u'lat': -33.8170114,
                                                     u'lng': 151.0034771},
                                 u'travel_mode': u'WALKING'},
                                {u'distance': {u'text': u'0.2 km',
                                               u'value': 183},
                                 u'duration': {u'text': u'2 mins',
                                               u'value': 134},
                                 u'end_location': {u'lat': -33.8150393,
                                                   u'lng': 151.0029224},
                                 u'html_instructions': u'Turn <b>left</b> to stay on <b>Church St</b>',
                                 u'maneuver': u'turn-left',
                                 u'polyline': {u'points': u'pxkmEwzsx[SN[NMFMDIBK@UBG@IAC?A?G?YDQBC@CBA@A@A@CBKJKFMDOBG@E?E?QA'},
                                 u'start_location': {u'lat': -33.8165694,
                                                     u'lng': 151.0034844},
                                 u'travel_mode': u'WALKING'},
                                {u'distance': {u'text': u'0.2 km',
                                               u'value': 158},
                                 u'duration': {u'text': u'2 mins',
                                               u'value': 144},
                                 u'end_location': {u'lat': -33.8146729,
                                                   u'lng': 151.0012743},
                                 u'html_instructions': u'Turn <b>left</b> onto <b>Macquarie St</b>',
                                 u'maneuver': u'turn-left',
                                 u'polyline': {u'points': u'~nkmEgwsx[CVIf@Kr@[xBSzA'},
                                 u'start_location': {u'lat': -33.8150393,
                                                     u'lng': 151.0029224},
                                 u'travel_mode': u'WALKING'}],
                     u'travel_mode': u'WALKING'}],
         u'traffic_speed_entry': [],
         u'via_waypoint': []}],
u'overview_polyline': {u'points': u'~_rmEa|_y[tB`Iz@|CPEOHl@rB_PjHC@iD|AUDi@Bi@CoAc@aAfDQdAGpAHlBCjADnAN\\fIlDaA`Dq@fAy@fAiAx@qCvAoAdAe@n@{AnD?@k@|ASVBJENOHMIEQIIo@c@cAcAS?KKCYk@q@{BoBUEGO?Iw@k@AAcC}A{BaA_@KQ@IOyAc@gG}AQ?yAs@aBiA}AyAaAkB]o@SCKWmE~Dg@u@uAa@A?}@Uq@~DqCi@eAWm@|DcApEuBjMcCdOqLyCmHmB}AUcFa@}f@}CgJi@oH@_BEsBBe@FOPG\\cBlU{A`T}Bf[eA`OgAzNOtAYzA_A`DA@sAzEiB~EQj@uArFeAxFGxADlFXtPEtEMdDw@nI}@xJIhBXvIpAj]\\`LQvCKlBjBNfGvApA\\jBr@tBbAzAXNNxBl@xEdAz@TnCd@jHYd@Wn@y@h@_@xAc@Jh@Bd@Ez@IVANc@dAgBzDKIS`@cAxBK^CVANQFOBe@@OMo@^[Ls@JWAs@NIHWR]HM@WAu@lFSzA'},
u'summary': u'',
u'warnings': [u'Walking directions are in beta.    Use caution \u2013 This route may be missing sidewalks or pedestrian paths.'],
u'waypoint_order': []}]

再一次,我需要从Json中提取所有方向,其中一些是缩进的[leg] [步骤] [步骤],我能够得到所有[leg] [步骤]但是在解析时遇到问题[腿] [步骤] [步骤] 第二天我和这个人打架,不知道在哪里看。有关stackoverflow的所有先前问题都没有回复此问题,请不要标记为dublicate(我已经阅读了所有相关帖子)

1 个答案:

答案 0 :(得分:1)

检查&#39;步骤&#39;在访问它之前就在你的词典中。

 ...
 #till here works fine
 if 'steps' in step:
     for stepp in step['steps']:
         y=stepp['html_instructions']
         print y

这样做你想要的吗?