Как перейти к следующему элементу, когда запрошенное значение не найдено в файле json - PullRequest
0 голосов
/ 20 февраля 2020

Я довольно новичок в Python. Я пытаюсь извлечь аналитическую информацию из API пакетов homebrew через модуль Запрос . Для этого я сначала динамически получаю URL-адреса для каждого пакета, а затем набираю oop над каждым URL-адресом, чтобы получить необходимую информацию. Сценарий работает хорошо, пока l oop не остановится над пакетом "carina". Я полагаю, что остановка вызвана тем, что путь package_json['analytics']['install']['30d'][package_name] больше не является правильным в части [package_name] ( имя пакета в словаре аналитики становится "carina --HEAD" ).

На этот раз я бы хотел, чтобы l oop просто перешел к следующему пакету и распечатал сообщение об ошибке.

До сих пор я пытался решить ее, используя следующее:

    try:
        r = requests.get(package_url)
        package_json = r.json()
    exception:
        pass

, но это не работает.

Может ли кто-нибудь помочь мне, пожалуйста?

Сценарий

r = requests.get("https://formulae.brew.sh/api/formula.json")
packages_json = r.json()
packages_string = json.dumps(packages_json, indent=2)

results = []

t1 = time.perf_counter()

for package in packages_json:

    package_name = package["name"]
    package_desc = package["desc"]
    package_url = f'https://formulae.brew.sh/api/formula/{package_name}.json'

    try:
        r = requests.get(package_url)
        package_json = r.json()
    exception:
        pass


    installs_30 = package_json['analytics']['install']['30d'][package_name]
    installs_90 = package_json['analytics']['install']['90d'][package_name]
    installs_365 = package_json['analytics']['install']['365d'][package_name]

    data = {
        "nome": package_name,
        "descrizione": package_desc,
        "analytics": {
            "30d": installs_30,
            "90d": installs_90,
            "365d": installs_365
        }
    }

    results.append(data)

    time.sleep(r.elapsed.total_seconds())


    if r.status_code != 200:
        print (f"Got error for {package_name}")
    else:
        print(f'Got {package_name} in {r.elapsed.total_seconds()} seconds')


t2 = time.perf_counter()


print(f"Finito in {t2-t1} secondi")

with open("packages_info.json", "w") as f:
    json.dump(results, f, indent=2)

Сообщение об ошибке

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-3-42e0fb795383> in <module>
     16 
     17 
---> 18     installs_30 = package_json['analytics']['install']['30d'][package_name]
     19     installs_90 = package_json['analytics']['install']['90d'][package_name]
     20     installs_365 = package_json['analytics']['install']['365d'][package_name]

KeyError: 'carina'

Ответы [ 3 ]

2 голосов
/ 20 февраля 2020

Я думаю, что есть проблемы в вашем синтаксисе в коде, упомянутом выше. Попробуйте это -

try:
    r = requests.get(package_url)
    package_json = r.json() 
    installs_30 = package_json['analytics']['install']['30d'[package_name]
    installs_90 = package_json['analytics']['install']['90d'[package_name]
    installs_365 = package_json['analytics']['install']['365d'[package_name]
except KeyError:
    pass
1 голос
/ 20 февраля 2020

Другие ответы могут быть неполными. Хотя верно то, что изменение exception на except устранит одну из ошибок, ваш вопрос, в частности, касается проверки пути package_json['analytics']['install']['30d'][package_name] и перехода к следующему пакету, если возникает ключевая ошибка. Для этого вам нужно, чтобы ваш try/except вызов был заключен в эти конкретные строки кода. Вот один пример:

r = requests.get("https://formulae.brew.sh/api/formula.json")
packages_json = r.json()
packages_string = json.dumps(packages_json, indent=2)

results = []

t1 = time.perf_counter()

for package in packages_json:

    package_name = package["name"]
    package_desc = package["desc"]
    package_url = f'https://formulae.brew.sh/api/formula/{package_name}.json'

    try:
        r = requests.get(package_url)
        package_json = r.json()
        installs_30 = package_json['analytics']['install']['30d'][package_name]
        installs_90 = package_json['analytics']['install']['90d'][package_name]
        installs_365 = package_json['analytics']['install']['365d'][package_name]

        data = {
            "nome": package_name,
            "descrizione": package_desc,
            "analytics": {
                "30d": installs_30,
                "90d": installs_90,
                "365d": installs_365
            }
        }

        results.append(data)


        time.sleep(r.elapsed.total_seconds())


        if r.status_code != 200:
            print (f"Got error for {package_name}")
        else:
            print(f'Got {package_name} in {r.elapsed.total_seconds()} seconds')
    except:
        pass

t2 = time.perf_counter()


print(f"Finito in {t2-t1} secondi")

with open("packages_info.json", "w") as f:
    json.dump(results, f, indent=2)
0 голосов
/ 20 февраля 2020

Эй, вы неправильно использовали синтаксис следующей части:

try:
    r = requests.get(package_url)
    package_json = r.json()
exception:
    pass

Я только что запустил код в colab, он работал нормально для меня, просто измените exception на except.

import requests
import json
import time

r = requests.get("https://formulae.brew.sh/api/formula.json")
packages_json = r.json()
packages_string = json.dumps(packages_json, indent=2)

results = []

t1 = time.perf_counter()

for package in packages_json:

    package_name = package["name"]
    package_desc = package["desc"]
    package_url = f'https://formulae.brew.sh/api/formula/{package_name}.json'

    try:
        r = requests.get(package_url)
        package_json = r.json()
    except:
      pass


    installs_30 = package_json['analytics']['install']['30d'][package_name]
    installs_90 = package_json['analytics']['install']['90d'][package_name]
    installs_365 = package_json['analytics']['install']['365d'][package_name]

    data = {
        "nome": package_name,
        "descrizione": package_desc,
        "analytics": {
            "30d": installs_30,
            "90d": installs_90,
            "365d": installs_365
        }
    }

    results.append(data)

    time.sleep(r.elapsed.total_seconds())


    if r.status_code != 200:
        print (f"Got error for {package_name}")
    else:
        print(f'Got {package_name} in {r.elapsed.total_seconds()} seconds')


t2 = time.perf_counter()


print(f"Finito in {t2-t1} secondi")

with open("packages_info.json", "w") as f:
    json.dump(results, f, indent=2)

Результат

Got a2ps in 0.028664 seconds
Got a52dec in 0.027885 seconds
Got aacgain in 0.028514 seconds
Got aalib in 0.026989 seconds

И так далее .. Удачи

...