2

I have been using the Python script below to try and retrieve and extract some data from Flightradar24, it would appear that it extracts the data in JSON format and will print the data out ok fully using json.dumps, but when I attempt to select the data I want (the status text in this case) using get it gives the following error:

'list' object has no attribute 'get'

Is the Data in JSON or a List ? I'm totally confused now.

I'm fairly new to working with data in JSON format, any help would be appreciated!

Script:

import flightradar24
import json

flight_id = 'BA458' 
fr = flightradar24.Api()
flight = fr.get_flight(flight_id)

y = flight.get("data")
print (json.dumps(flight, indent=4))

X= (flight.get('result').get('response').get('data').get('status').get('text'))
print  (X)

Sample of output data:

{
"result": {
"request": {
"callback": null,
"device": null,
"fetchBy": "flight",
"filterBy": null,
"format": "json",
"limit": 25,
"page": 1,
"pk": null,
"query": "BA458",
"timestamp": null,
"token": null
},
"response": {
"item": {
"current": 16,
"total": null,
"limit": 25
},
"page": {
"current": 1,
"total": null
},
"timestamp": 1546241512,
"data": [
{
"identification": {
"id": null,
"row": 4852575431,
"number": {
"default": "BA458",
"alternative": null
},
"callsign": null,
"codeshare": null
},
"status": {
"live": false,
"text": "Scheduled",
"icon": null,
"estimated": null,
"ambiguous": false,
"generic": {
"status": {
"text": "scheduled",
"type": "departure",
"color": "gray",
"diverted": null
},
0

2 Answers 2

1

You can use print(type(variable_name)) to see what type it is. The .get(key[,default]) is not supported on lists - it is supported for dict's.

X = (flight.get('result').get('response').get('data').get('status').get('text'))
#                                            ^^^^^^^^ does not work, data is a list of dicts

as data is a list of dicts:

"data": [          # <<<<<< this is a list
{
"identification": {
"id": null,
"row": 4852575431,
"number": {
"default": "BA458",
"alternative": null
},
"callsign": null,
"codeshare": null
},
"status": {

This should work:

 X = (flight.get('result').get('response').get('data')[0].get('status').get('text')
Sign up to request clarification or add additional context in comments.

Comments

1

The issue, as pointed out by @PatrickArtner, is your data is actually a list rather than a dictionary. As an aside, you may find your code more readable if you were to use a helper function to apply dict.get repeatedly on a nested dictionary:

from functools import reduce

def ng(dataDict, mapList):
    """Nested Getter: Iterate nested dictionary"""
    return reduce(dict.get, mapList, dataDict)

X = ng(ng(flight, ['result', 'response', 'data'])[0], ['status'[, 'text']])

1 Comment

Thanks. I'll give that a go. Would be worth it if it makes things easier to pin down the data I want.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.