从API解析JSON时出现KeyError

2024-09-29 19:33:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要解析从API请求的JSON文件中的数据。API文档提供了一个关于如何实现它的示例代码,但是他们的方法会导致以下错误:

Traceback (most recent call last):
  File "testing2.py", line 11, in <module>
    for flight in api_response['results']:
KeyError: 'results'

我花了很多时间寻找可能的原因,但我找不到适合我的解决方案。Python文件如下所示:

import requests

params = {
  'access_key': my_access_key'
}

results = requests.get('http://api.aviationstack.com/v1/flights?access_key=my_access_key&airline_name=Air%20India&flight_number=560')

api_response = results.json()

for flight in api_response['results']:
    if (flight['live']['is_ground'] is False):
        print(u'%s flight %s from %s (%s) to %s (%s) is in the air.' % (
            flight['airline']['name'],
            flight['flight']['iata'],
            flight['departure']['airport'],
            flight['departure']['iata'],
            flight['arrival']['airport'],
            flight['arrival']['iata']))

我已经能够通过print(api_response)读取数据,但是我无法解析任何数据,因为键“results”似乎根本不存在

编辑:

这是直接转到URL或print(api_response)的结果,这是一大块文本:

{“分页”:{“限制”:100,“偏移”:0,“计数”:4,“总计”:4},“数据”:{“航班日期”:“2020-09-02”,“航班状态”:“着陆”,“起飞”:{“机场”:“英迪拉·甘地国际”,“时区”:“亚洲/加尔各答”,“国际航空运输协会”:“DEL”,“国际民航组织”:“VIDP”,“航站楼”:“3”,“登机口”:“33”,“延误”:4,“计划”:“2020-09-02T07:15:00”,“预计”:“2020-09-02T07:15+00:00”,“实际”:“2020-09-02T07:18:00+00:00”,“预计跑道”:“2020-09-02T07:18:00+00:00”,“实际跑道”:“2020-09-02T07:18:00+00:00”;“抵达”:{“机场”:“海得拉巴机场”,“时区”:“亚洲/加尔各答”,“国际航空运输协会”:“HYD”,“国际民航组织”:“VOHS”,“航站楼”:“1”,“登机口”:空,“行李”:空,“延误”:2,“计划”:“2020-09-02T09:10+00:00”,“预计”:2020-09-02T09:10:00+00:00,“实际”:“2020-09-02T09:09:00+00:00”,“预计跑道”:“2020-09-02T09:09:00+00:00”,“实际跑道”:“2020-09-02T09:09:00+00:00”;“航空公司”:“名称”:“印度航空公司”,“国际航空运输协会”:“AI”,“国际民航组织”:“AIC”;“航班号”:“560”,“国际航空运输协会”:“AI560”,“国际民航组织”:“AIC560”,“代码共享”;“空号”;“飞机”;“注册号”:“国际航空运输协会”,“国际民航组织”;“A20M”:“,”icao24“:”800C4B“,”实况“:”空“,”航班日期“:”2020-09-01“,”航班状态“:”着陆“,”起飞“,”机场“:”蒂鲁帕蒂“,”时区“:”亚洲/加尔各答“,”国际航空运输协会“:”TIR“,”icao“:”VOTP“,”航站楼“:”空“,”登机口“:”空“,”延误“,”空“,”预定“:”2020-09-01T10:20:00+00:00”,“预计“,”2020-09-01T10:00+00:00+00”,“实际“,”预计跑道“,”“2020-09-01T10:06:00+00:00”,“实际跑道”:“2020-09-01T10:06:00+00:00”;“抵达”:“机场”:“海得拉巴机场”,“时区”:“亚洲/加尔各答”,“国际航空运输协会”:“HYD”,“国际民航组织”:“VOHS”,“航站楼”:“3”,“登机口”:空,“行李”:空,“延误”:空,“计划”:“2020-09-01T11:40+00:00”,“预计”:“2020-09-01T11:40+00:00”,“实际”:“2020-09-01T10:51+00”,“预计跑道”:“2020-09-01T10:51:00+00:00”,“实际跑道”:“2020-09-01T10:51:00+00:00”,“航空公司”:“名称”:“印度航空公司”,“国际航空运输协会”:“AI”,“国际民航组织”:“AIC”},“航班”:“编号”:“560”,“国际航空运输协会”:“AI560”,“国际民航组织”:“AIC560”,“代码共享”:空},“飞机”:空,“实时”:空},{“航班日期”:“2020-09-01”,“航班状态”:“着陆”,“起飞”:“机场”:“空”英迪拉·甘地国际,“时区”:“亚洲/加尔各答”,“国际航空运输协会”:“DEL”,“国际民航组织”:“VIDP”,“航站楼”:“3”,“登机口”:“29B”,“延迟”:“6”,“计划”:“2020-09-01T06:50:00+00:00”,“预计”:“2020-09-01T06:50:00+00:00”,“实际”:“2020-09-01T06:56:00+00:00”,“预计跑道”:“2020-09-01T06:56:00+00:00”,“实际跑道”:“2020-09-01T06:56:00+00”“:”海得拉巴机场“,”时区“,”亚洲/加尔各答“,”国际航空运输协会“,”HYD“,”国际民航组织“,”VOHS“,”航站楼“,”2“,”登机口“,”行李“,”空区“,”延误“,”空区“,”计划“,”2020-09-01T09:20:00+00:00“,”实际“,”空区“,”预计跑道“,”空区“,”航空公司“,”名称“,”印度航空公司“,”国际航空运输协会“,”AI“,”国际民航组织“:”AIC“,”航班“,”号“:”560”,“iata”:“AI560”,“icao”:“AIC560”,“代码共享”:null},“飞机”:{“注册”:“VT-EXM”,“iata”:“A20N”,“icao”:“A20N”,“icao24”:“800C4B”},“直播”:null},{“航班日期”:“2020-09-01”,“航班状态”:“着陆”,“起飞”:{“机场”:“海得拉巴机场”,“时区”:“亚洲/加尔各答”,“iata”:“HYD”,“icao”:“VOHS”,“航站楼”:null,“登机口”:null,“延误”:null,“预定”:“2020-09-01T12:45:00+00:00”,“预计”:“2020-09-01T12:45:00+00:00”,“实际”:“2020-09-01T12:41:00+00:00”,“预计跑道”:“2020-09-01T12:41:00+00:00”,“实际跑道”:“2020-09-01T12:41:00+00:00”;“抵达”:{“机场”:“英迪拉·甘地国际”,“时区”“亚洲/加尔各答”,“国际航空运输协会”:“DEL”,“国际民航组织”:“VIDP”,“航站楼”:“3”,“登机口”:空,“行李”:空,“延误”:空,“计划”:“2020-09-01T14:55:00+00:00”,“预计”:“2020-09-01T14:55:00+00:00”,“实际”:“2020-09-01T14:42:00+00:00”,“预计跑道”:“2020-09-01T14:42:00+00:00”;“实际跑道”:“2020-09-01T14:42:00+00:00”;“航空公司名称”:“印度航空公司”,“国际航空运输协会”:,“国际民航组织”:“AIC”},“航班”:{“号码”:“560”,“国际航空运输协会”:“AI560”,“国际民航组织”:“AIC560”,“代码共享”:null},“飞机”:null,“现场”:null}]}


Tags: 代码inapiresponsenullresults计划flight
1条回答
网友
1楼 · 发布于 2024-09-29 19:33:31

试试这个。它访问键data,而不是键results(该键可能在响应中不存在),并且在访问飞行对象中的live键时不会引发TypeError,该键可能为空(当它在地面上时)

import requests

params = {
  'access_key': access_key,
  'airline_name': 'Air India',
  'flight_number': 560
}


results = requests.get('http://api.aviationstack.com/v1/flights', params=params)

api_response = results.json()

for flight in api_response['data']:
    if flight.get('live') and not flight['live']['is_ground']:
        print('{} flight {} from {} ({}) to {} ({}) is in the air.'.format(
            flight['airline']['name'],
            flight['flight']['iata'],
            flight['departure']['airport'],
            flight['departure']['iata'],
            flight['arrival']['airport'],
            flight['arrival']['iata']))
    else:
        print("All flights landed.")

相关问题 更多 >

    热门问题