遍历JSON未获取全部预期值 NHL接口高光数据提取结果异常
问题描述
我需要提取每条高光记录的blurb字段值,以及FLASH_1800K_896x504规格对应的播放URL,为此编写了如下遍历代码:
import requests game_url = "http://statsapi.web.nhl.com/api/v1/game/2021030321/content" team_response = requests.get(game_url) js = team_response.json() newdata = js['highlights']['gameCenter']['items'] for item in newdata: print(item['blurb']) print(item['playbacks'][3]['url'])
我通过Ctrl-F检索接口返回的完整数据文件,预期应当得到51条对应结果,但实际运行代码仅返回15条,请问是否存在明显的逻辑疏漏导致结果不全?
问题排查结论
你的代码存在两处明确逻辑错误,直接导致结果不全:
- 取数路径覆盖不全:当前仅遍历了
highlights.gameCenter.items节点,该节点仅存储15条官方精选的全场焦点高光。剩余36条单事件、单进球类高光记录存储在同级的highlights.scoreboard.items节点下,两个节点的条目相加才是你检索到的全部51条高光数据。 - 播放地址提取逻辑不可靠:直接使用固定索引
[3]读取playbacks列表元素,完全依赖接口返回的列表顺序,但实际不同高光条目下的播放源排列顺序并不统一,硬编码索引不仅容易取错清晰度规格,遇到playbacks长度不足4的条目还会直接触发索引报错、中断遍历,进一步造成结果缺失。
修正后代码
不要依赖固定索引取播放地址,改为按name字段匹配目标规格FLASH_1800K_896x504,同时合并两个高光节点的全部条目后再遍历:
import requests game_url = "http://statsapi.web.nhl.com/api/v1/game/2021030321/content" team_response = requests.get(game_url) js = team_response.json() # 合并两个路径下的所有高光条目 all_highlights = js['highlights']['gameCenter']['items'] + js['highlights']['scoreboard']['items'] for item in all_highlights: print(item['blurb']) play_url = None for playback in item['playbacks']: if playback['name'] == 'FLASH_1800K_896x504': play_url = playback['url'] break print(play_url)
运行后即可正常输出全部51条高光的对应信息。
内容的提问来源于stack exchange,提问作者smitty_werben_jagerm
相关产品推荐
相关产品推荐

