如何从PunkAPI的JSON嵌套列表中提取符合条件的饮品和啤酒花信息
代码修复与实现方案
原有代码错误点
- 字段访问路径错误:
mash_temp是method的子字段,无法直接从接口返回的啤酒对象根层级读取 - 数据类型处理错误:
mash_temp是数组格式(支持多段糖化工艺),需要遍历每一段工艺校验条件,且不能和字符串类型的"65"做数值比较 - 缺少
duration≥75的校验逻辑
完整实现代码
import requests url = 'https://api.punkapi.com/v2/beers' resp = requests.get(url) # 增加请求异常校验,避免接口失败时报错 resp.raise_for_status() beer_list = resp.json() print("===== 需求1:符合条件的饮品名称 =====") for beer in beer_list: mash_temp_list = beer.get("method", {}).get("mash_temp", []) # 判断是否存在至少一段符合要求的糖化工艺,可根据业务需要调整为所有段都符合条件 is_match = any( item.get("temp", {}).get("value", 0) >= 65 and (item.get("duration") or 0) >= 75 for item in mash_temp_list ) if is_match: print(beer["name"]) print("\n===== 需求2:啤酒花原料提取结果 =====") for beer in beer_list: beer_id = beer["id"] beer_name = beer["name"] hop_list = beer.get("ingredients", {}).get("hops", []) for hop in hop_list: hop_name = hop["name"] hop_amount = f"{hop['amount']['value']}{hop['amount']['unit']}" hop_attr = hop["attribute"] print(f"饮品ID:{beer_id},饮品名称:{beer_name},啤酒花名称:{hop_name},用量:{hop_amount},属性:{hop_attr}")
逻辑说明
- 代码增加了字段缺省值判断,避免接口返回字段缺失时触发运行报错
- 需求1的匹配逻辑默认只要有一段糖化工艺符合条件就算匹配,你可以把
any()换成all()调整为所有工艺段都满足要求 - 需求2的输出格式可以根据你的实际需要调整,比如改为存储到列表、导出到CSV文件等
内容的提问来源于stack exchange,提问作者paul
相关产品推荐
相关产品推荐

