使用ESPN API遍历赛事详情仅返回首个event的技术求助
问题:ESPN API遍历赛事仅返回首个赛事数据
尝试使用ESPN API遍历赛事详情,但仅能返回第一个event,打印区域也只输出首个赛事的信息。
原实现代码
response = requests.get(JSON_URL) json_data = response.json() game_status = [] home_team = [] home_score = [] away_team = [] away_score = [] for event in json_data['events']: if event['season']['type'] == 2: print(event['season']['type'], event['competitions'][0]['competitors'][0]['team']['abbreviation'], event['competitions'][0]['competitors'][0]['score'], event['competitions'][0]['competitors'][1]['team']['abbreviation'], event['competitions'][0]['competitors'][1]['score'], event['competitions'][0]['status']['type']['shortDetail']) for games in json_data['events']: home_team.append(games['competitions'][0]['competitors'][0]['team']['abbreviation']) home_score.append(games['competitions'][0]['competitors'][0]['score']) away_team.append(games['competitions'][0]['competitors'][1]['team']['abbreviation']) away_score.append(games['competitions'][0]['competitors'][1]['score']) game_status.append(games['competitions'][0]['status']['type']['shortDetail']) data = { #'home_team':home_team, #'home_score': home_score, #'away_team': away_team, #'away_score': away_score, #'game_status': game_status, 'seasontype' : 2, 'scoreboard' : {'home_team': home_team, 'home_score': home_score, 'away_team': away_team , 'away_score': away_score , 'game_status': game_status} } return jsonify(data) if __name__ == "__main__": app.run(host='0.0.0.0')
当前返回结果
[18/Dec/2022 23:28:58] "GET / HTTP/1.1" 200 - [{'name': 'ARI @ DEN', 'date': '2022-12-18T21:05Z', 'hometeam': 'DEN', 'homeid': '7', 'homescore': 24, 'awayteam': 'ARI', 'awayid': '22', 'awayscore': 15, 'down': None, 'spot': None, 'time': '0:00', 'quarter': 4, 'over': True, 'redzone': None, 'possession': None, 'state': 'post'}]
需求:遍历每个event并返回全部赛事数据,但目前仅列出第一场比赛。
问题原因
- 循环逻辑错误:外部
for event循环内部嵌套了另一个遍历所有赛事的循环,且return语句放在外部循环的第一次迭代中,导致程序处理完第一个赛事就直接返回,后续赛事完全没处理。 - 未过滤赛事类型:内部循环没有判断
season['type'] == 2,会把所有赛事都加入列表,不符合需求。
修复后的代码
response = requests.get(JSON_URL) json_data = response.json() game_status = [] home_team = [] home_score = [] away_team = [] away_score = [] # 遍历所有赛事,仅处理赛季类型为2的赛事 for event in json_data['events']: if event['season']['type'] == 2: # 打印符合条件的赛事信息 print(event['season']['type'], event['competitions'][0]['competitors'][0]['team']['abbreviation'], event['competitions'][0]['competitors'][0]['score'], event['competitions'][0]['competitors'][1]['team']['abbreviation'], event['competitions'][0]['competitors'][1]['score'], event['competitions'][0]['status']['type']['shortDetail']) # 收集符合条件的赛事数据 home_team.append(event['competitions'][0]['competitors'][0]['team']['abbreviation']) home_score.append(event['competitions'][0]['competitors'][0]['score']) away_team.append(event['competitions'][0]['competitors'][1]['team']['abbreviation']) away_score.append(event['competitions'][0]['competitors'][1]['score']) game_status.append(event['competitions'][0]['status']['type']['shortDetail']) # 所有赛事处理完成后再构造并返回数据 data = { 'seasontype' : 2, 'scoreboard' : { 'home_team': home_team, 'home_score': home_score, 'away_team': away_team, 'away_score': away_score, 'game_status': game_status } } return jsonify(data) if __name__ == "__main__": app.run(host='0.0.0.0')
修复说明
- 移除内部冗余的赛事遍历循环,直接在外部循环中处理符合条件的赛事。
- 将
return jsonify(data)移到循环外部,确保所有符合条件的赛事都被处理完毕再返回结果。 - 仅收集
season['type'] == 2的赛事数据,匹配需求。
内容的提问来源于stack exchange,提问作者John Maestrale
相关产品推荐
相关产品推荐

