Python - Как продолжить, если элемент json не найден - PullRequest
0 голосов
/ 28 июня 2018

Так что я играл с Джсоном и немного сравнивал.

Так что в основном у меня есть Json, где некоторые элементы включены в некоторые элементы, а некоторые нет.

Проблема, с которой я сталкиваюсь, заключается в том, что скрипт продолжает сценарий снова и снова, но никогда ничего не делает из-за исключительной ситуации, когда он не может найти элементы и т. Д. Цена , оценкаLaunchDate , которая будет найден в этом Json

sample = {
"threads": [{
        "seoTitle": "used food",
        "other_crap": "yeet"
    },
    {
        "seoTitle": "trucks",
        "other_crap": "it's a fox!"
        "product": {
            "imageUrl": "https://imagerandom.jpg",
            "price": {
                "fullRetailPrice": 412.95
            },
            "estimatedLaunchDate": "2018-06-02T03:00:00.000",
            "publishType ": "DRAW"
        },
        {
            "seoTitle": "rockets",
            "other_crap": "i'm rocket man"
        },
        {
            "seoTitle": "helicopter",
            "other_crap": "for 007"
            "product": {
                "imageUrl": "https://imagerandom.jpg",
                "price": {
                    "fullRetailPrice": 109.95
                },
                "estimatedLaunchDate": "2018-06-19T00:00:00.000",
                "publishType": "FLOW"
            }
        }
    ]
}

Как вы можете видеть, в некоторых элементах json содержится некоторая дополнительная информация, и у меня есть проблема: что / как я могу сделать так, чтобы она продолжалась или просто добавлялась и т. Д. "Цена не указана найдено ", " publishType not found " и все еще продолжите работу json?

Я сделал код, который делает это до сих пор:

old_list = []

    while True:
        try:
            resp = requests.get("www.helloworld.com")
            new_list = resp.json()['threads']

            for item in new_list:

                newitemword = item['seoTitle']

                if newitemword not in old_list:
                    try:

                        print(newitemword) #item name

                        print(str(item['product']['price']['fullRetailPrice']))
                        print(item['product']['estimatedLaunchDate']) 
                        print(item['product']['publishType']) 


                        old_list.append(newitemword)



                    except Exception as e:
                        print(e)
                        print("ERROR")
                        time.sleep(5)
                        continue


            else:
                randomtime = random.randint(40, 60)
                time.sleep(randomtime)

Как вы можете видеть, в методе try есть только 4 отпечатка, и если один из этих 3 (fullRetailPrice, оценкаLaunchDate, publishType) вызовет исключение, он не продолжит оставшуюся часть кода, что означает, что он уже умрет после "seoTitle": "trucks", элемент!

1 Ответ

0 голосов
/ 28 июня 2018

Я не буду переписывать весь ваш пример, но предположим, что при поиске значение

print(str(item['product']['price']['fullRetailPrice']))

одна или несколько из тех клавиш, которые вы нажимаете, могут отсутствовать. Вы можете обнаружить это в коде, выполнив

foo = item.get('product', {}).get('price', {}).get('fullRetailPrice')
if foo:
    print(str(foo))
else:
    print('Retail price could not be found')

Второй параметр get - это значение, которое возвращается, если требуемый ключ не может быть найден. Сделав это возвращение пустого словаря {} позволит вам продолжать проверять строку до конца. Последний get вернет None, если какой-либо из ключей не найден. Затем вы можете проверить, является ли foo Нет, и распечатать сообщение об ошибке соответствующим образом.

...