
本文深入探讨了在Python中从嵌套API响应中提取数据时,因循环缩进不当导致字典追加不完整的问题。通过一个具体的PGA高尔夫赛事数据抓取案例,详细分析了错误原因,并提供了正确的代码结构和解决方案。教程强调了Python中缩进的重要性,指导读者如何确保在多层嵌套循环中正确构建并累加所有目标数据记录,最终生成完整的DataFrame。
在处理来自外部API的复杂JSON数据时,开发者经常需要遍历多层嵌套结构来提取所需信息。然而,不正确的代码缩进是导致数据丢失或不完整的一个常见陷阱。本教程将
通过一个实际案例,详细剖析这一问题及其解决方案。
假设我们需要从ESPN的PGA高尔夫赛事API中获取所有参赛选手的信息。API返回的JSON数据结构通常是多层嵌套的,例如:events -> competitions -> competitors -> athlete。我们的目标是从中提取每个赛事(event)的ID、日期、名称以及所有参赛选手(playerName)。
初次尝试的代码可能如下所示,旨在遍历赛事和选手并收集数据:
import requests
import pandas as pd
# 定义API端点
api = 'https://site.web.api.espn.com/apis/site/v2/sports/golf/leaderboard?league=pga'
# 发送GET请求并获取JSON响应
response = requests.get(api)
data = response.json()
# 提取事件数据
events = data['events']
# 创建一个空列表来存储游戏数据
games = []
# 遍历每个事件并获取相关信息
for event in events:
game_id = event['id']
date = event['date']
name = event['name']
for competition in event['competitions']:
for competitor in competition['competitors']:
athlete = competitor['athlete']
playerName = athlete['displayName'] # 每次循环都会更新playerName变量
# 在循环外部创建字典并追加,此时playerName已是最后一个competitor的值
game = {
'game_id': game_id,
'date': date,
'name': name,
'playerName': playerName
}
games.append(game)
# 转换为pandas DataFrame
df = pd.DataFrame(games)
print(df)运行上述代码,我们可能会得到类似以下的结果:
game_id date name playerName 0 401580329 2025-01-04T05:00Z The Sentry Sam Burns
从结果中可以看出,尽管API响应中包含多名选手,但最终的DataFrame中却只显示了最后一位选手的记录(例如 "Sam Burns"),并且每场赛事只有一条记录,这显然不是我们期望的。
出现上述问题的原因在于Python的缩进规则和变量作用域。在原始代码中:
GoEnhance
全能AI视频制作平台:通过GoEnhance AI让视频创作变得比以往任何时候都更简单。
347
查看详情
因此,对于每个赛事,无论有多少参赛者,我们最终只会得到一条记录,其中包含该赛事下最后一个参赛者的信息。
要解决这个问题,我们需要确保在每次遍历到新的 competitor 时,都创建一个新的 game 字典并将其追加到 games 列表中。这需要将 game 字典的创建和 games.append(game) 操作移动到 for competitor 循环的 内部,使其成为该循环的一部分。
以下是修正后的代码:
import requests
import pandas as pd
# 定义API端点
api = 'https://site.web.api.espn.com/apis/site/v2/sports/golf/leaderboard?league=pga'
# 发送GET请求并获取JSON响应
response = requests.get(api)
data = response.json()
# 提取事件数据
events = data['events']
# 创建一个空列表来存储游戏数据
games = []
# 遍历每个事件并获取相关信息
for event in events:
game_id = event['id']
date = event['date']
name = event['name']
for competition in event['competitions']:
for competitor in competition['competitors']:
athlete = competitor['athlete']
playerName = athlete['displayName']
# 关键修改:将字典创建和追加操作移到最内层循环内部
game = {
'game_id': game_id,
'date': date,
'name': name,
'playerName': playerName
}
games.append(game) # 每次循环一个competitor,就创建一个字典并追加
# 转换为pandas DataFrame
df = pd.DataFrame(games)
print(df)通过这次修改,每当代码遍历到一个新的 competitor 时,它都会立即创建一个包含当前 game_id、date、name 和 playerName 的字典,并将其添加到 games 列表中。这样,所有参赛者的信息都将被正确捕获和存储。
在Python中处理API响应并提取嵌套数据时,正确理解和运用缩进是避免数据丢失的关键。本教程通过一个具体的案例,强调了将字典创建和列表追加操作放置在正确循环层级的重要性。掌握这些基本原则,将有助于你更高效、准确地处理复杂数据,构建健壮的数据处理流程。
以上就是Python API数据提取教程:理解循环与字典创建的缩进陷阱的详细内容,更多请关注其它相关文章!
相关文章:
AO3官方在线访问地址 Archive of Our Own最新镜像合集
PHP表单数据传递:如何通过隐藏输入字段获取动态ID
在WordPress中通过REST API访问受BasicAuth保护的站点内容
vivo手机互传视频怎么操作_vivo手机互传视频详细传输方法
移动端XML文件怎么转换成Excel 手机和平板上的解决方案
qq游戏网页版直接玩_qq游戏免下载快速入口
精准捕获:如何在页面中监听除特定元素外的所有点击事件
《明末:渊虚之羽》设计师谈设计角色:那会刚毕业 充满激情
Angular Material 垂直步进器:实现底部到顶部排序的教程
KFC游戏互动怎么赢取优惠券_KFC线上游戏活动参与与优惠代码赢取教程
PDO预处理语句中冒号的正确处理:区分SQL函数格式与命名占位符
汽水音乐在线解析 汽水音乐在线解析入口
cad怎么合并重叠的线段_cad清理重复重叠线条的操作方法
Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】
Python中高效访问嵌套字典与列表中的键值对
WooCommerce产品页高级定制:实现基于分类的交叉销售
qq游戏免费畅玩入口_qq游戏电脑版快速启动
痛风发作了怎么办? 快速止痛和后期饮食调理
Android Studio计算器C键功能异常排查与修复教程
c++项目目录结构应该如何组织_c++工程化项目结构规范
抖音DOU+怎么投最有效 抖音付费推广的ROI提升技巧
PHP URL参数传递与500错误调试指南
Go语言中的*string:深入理解字符串指针
Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧
QQ邮箱网页版入口登录 QQ邮箱在线邮箱官方通道
EMS快递官网app_中国邮政速递物流手机客户端
Python复杂任务中断策略:通过回调函数实现优雅停止
谷歌浏览器怎么给标签页静音_Chrome标签静音快捷操作
Walmart退货API集成指南:PHP cURL实现与常见问题解析
iCloud登录入口网页版 苹果iCloud官网登录
KFC套餐升级怎么获取优惠代码_KFC套餐升级活动与优惠代码获取方法
React列表渲染与独立状态管理:避免全局状态影响局部更新
飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】
海棠账号登录入口_登录海棠账户同步阅读记录
哔哩哔哩忘记密码了怎么找回_哔哩哔哩密码找回方法
顺丰快件物流信息 官方网站查询入口
大麦的“候补”是什么意思 大麦候补购票规则【详解】
微信网页版扫码登录入口 微信网页版二维码登录入口
印象笔记怎样用批量导出备知识库_印象笔记用批量导出备知识库【备份方法】
优化LangChain文档加载与ChromaDB集成:解决多文档处理与分块问题
如何在CSS中使用visited与link控制链接颜色_visited link伪类配合
如何解决电商平台定制报价请求的“黑洞”问题,SprykerQuoteRequest模块助你提升客户体验与销售效率
Golang如何通过reflect操作map_Golang reflect map操作与遍历技巧
Python异步编程实践:使用Binance API构建实时交易数据流
微信语音通话掉线如何解决 微信语音通话稳定优化方法
C++如何打印当前代码行号与文件名_C++预定义宏FILE与LINE的使用
腾讯视频怎么举报不良内容_腾讯视频内容举报流程与违规信息处理方法
J*a最大堆Heapify方法修复:索引计算与边界条件深度解析
LINUX下如何进行磁盘分区_fdisk与parted工具在LINUX中的使用对比
C++如何使用AddressSanitizer(ASan)_C++调试工具中检测内存访问错误的利器