我正在对两个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']
答案 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