Выполните итерацию по вложенному объекту JSON и получите значения по всему

#python #json #parsing

Вопрос:

Работаю над проектом API, в котором я пытаюсь получить все URL-адреса перенаправления из выходных данных API, таких как https://urlscan.io/api/v1/result/39a4fc22-39df-4fd5-ba13-21a91ca9a07d/

Пример того, откуда я пытаюсь извлечь URL-адреса:

 "redirectResponse": {
  "url": "https://www.coke.com/"
 

В настоящее время у меня есть следующий код:

 import requests
import json
import time

#URL to be scanned
url = 'https://www.coke.com'

#URL Scan Headers
headers = {'API-Key':apikey,'Content-Type':'application/json'}
data = {"url":url, "visibility": "public"}
response = requests.post('https://urlscan.io/api/v1/scan/',headers=headers, data=json.dumps(data))

uuid = response.json()['uuid']
responseUrl = response.json()['api']

time.sleep(10)

req = requests.Session()
r = req.get(responseUrl).json()
r.keys()

for value in  r['data']['requests']['redirectResponse']['url']:
    print(f"{value}")

 

Я получаю следующую ошибку: TypeError: list indices must be integers or slices, not str . Не уверен, какой лучший способ проанализировать вложенный json, чтобы получить все URL-адреса перенаправления.

Ответ №1:

A redirectResponse не всегда присутствует в requests , поэтому код должен быть написан, чтобы справиться с этим и продолжать работать. В Python это обычно делается с try помощью / except :

 for obj in r['data']['requests']:
    try:
        redirectResponse = obj['request']['redirectResponse']
    except KeyError:
        continue  # Ignore and skip to next one.
    url = redirectResponse['url']
    print(f'{url=!r}')