如何在try / except循环中设置条件?

时间:2019-04-29 19:16:54

标签: python json python-3.x web-scraping

我正在对两个json文件进行数据抓取。

第一个可以收集一些数据。

第二个没有所需的数据。而且我想存储“ NA”。

我的问题是我不知道如何在脚本中正确存储我的“ NA”。

这是我的代码:

import requests

# this is our profile ids
profile=['kaid_896965538702696832878421','kaid_1143236333220233567674383']

# prepare the list to get data
badgechall=[]

# do this for each profile id
for kaid in profile:
    # request the api link of the profile
    data = requests.get('https://www.khanacademy.org/api/internal/user/{}/profile/widgets?lang=en&_=190424-1429-bcf153233dc9_1556201931959'.format(kaid)).json()

    # go through each json file to get the data
    for item in data:
        # try to find on each dictionary of the list the desired data or pass
        try:
            for badges in item['renderData']['badgeCountData']['counts']:
                if badges['typeLabel'] == 'Challenge Patches':
                    badgechall.append(badges['count'])
        except KeyError:
            pass

print(badgechall)

运行此代码时,我得到: [100]

我想得到的是: [100, 'NA']

'100'与第一个配置文件'kaid_896965538702696832878421'对应,而'NA'与第二个配置文件'kaid_1143236333220233567674383'对应。

我想获取第一个和第二个链接的数据,如果没有,则返回'NA'。因此,我们应该有一个只有2个值的列表。

我尝试过:

except KeyError:
    badgechall.append('NA')
    pass

但是它返回: [100, 'NA', 'NA', 'NA', 'NA', 'NA', 'NA', 'NA']

2 个答案:

答案 0 :(得分:1)

您可以定义一个函数,然后从该函数返回第一个计数或"NA"

def get_badge_count(data, badge='Challenge Patches'):
    for item in data:
        try:
            for badges in item['renderData']['badgeCountData']['counts']:
                if badges['typeLabel'] == badge:
                    return badges['count']
        except KeyError:
            pass
    return "NA"

for kaid in profile:
    data = requests.get('https://www.khanacademy.org/api/internal/user/{}/profile/widgets?lang=en&_=190424-1429-bcf153233dc9_1556201931959'.format(kaid)).json()
    badgechall.append(get_badge_count(data))

然后,badgechall[100, 'NA']。如果您想匹配另一个标签,则可以将其作为参数提供,例如get_badge_count(data, 'Sun Patches')

答案 1 :(得分:0)

您是不是想退出for循环?

        except KeyError:
            badgechall.append('NA')
            break