在json文件中找不到请求的值时,如何传递到下一个元素

2024-09-29 21:59:55 发布

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

我是Python的初学者。我试图通过请求模块从自制软件包API中提取分析信息。为此,我首先动态获取每个包的url,然后循环遍历每个url以获取所需的信息。脚本运行良好,直到循环在“carina”包上停止。我假设停止是因为路径package_json['analytics']['install']['30d'][package_name][package_name]部分(the package name in the analytics dictionary becomes "carina --HEAD")中不再正确

这一次,我希望循环只传递到下一个包并打印一条错误消息

到目前为止,我尝试使用以下方法解决此问题:

    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'

Tags: installnameinjsonurlpackagegettime
3条回答

嘿,你用错了以下部分的语法:

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

等等。。祝你好运

我认为上面提到的代码中的语法有问题。 试试这个-

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

其他答案可能不完整。虽然将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)

相关问题 更多 >

    热门问题