遍历JSON数据时无法提取嵌套Nutritions字段内容的技术求助
首先咱们直接戳核心问题:你代码里拿不到营养数据的根本原因是碳水、蛋白这些营养字段并非顶层字典的键,而是嵌套在nutritions这个子字典里,你直接从顶层字典访问这些字段自然找不到,再加上宽泛的except块把错误吞掉了,所以看起来完全没数据。
接下来拆解你代码里的几个具体错误:
1. 错误的嵌套字段访问逻辑
原代码里你写了carbohydrates.append(i['carbohydrates']),但根据你给出的JSON结构,正确的访问路径应该是i['nutritions']['carbohydrates']——所有营养数据都藏在nutritions这个嵌套字典里,直接从顶层字典找肯定找不到。
2. 无效的循环遍历代码
你写的for nutrs in i:这部分完全不对:遍历字典i时,nutrs拿到的是字典的键名(比如'genus'、'nutritions'),而不是对应的值;后面的nutrs.a['fat']更是语法错误,Python里根本没有这种访问方式,这部分代码完全起不到提取营养数据的作用。
3. 多余的JSON序列化/反序列化操作
scrape_all_fruits()已经返回了Python字典组成的列表,你不需要先转成JSON字符串(json.dumps)再解析回来(json.loads),这一步完全是画蛇添足,还会降低代码效率。
4. 过于宽泛的异常捕获
你的except:块会捕获所有类型的异常,包括字段缺失的KeyError、语法错误的AttributeError等,这会直接掩盖代码里的真实问题,让你根本不知道哪里出了错。建议只捕获特定的异常类型,比如KeyError或者请求相关的异常。
修正后的完整代码
我还调整了一些细节(比如把变量id改成fruit_ids,避免和Python内置函数id()冲突),修复后的代码如下:
import requests # 初始化存储列表,优化变量名避免和内置函数冲突 fruit_names = [] fruit_ids = [] families = [] genera = [] orders = [] carbohydrates = [] proteins = [] fats = [] calories = [] sugars = [] def scrape_all_fruits(): data_list = [] for fruit_id in range(1, 10): url = f'https://www.fruityvice.com/api/fruit/{fruit_id}' try: response = requests.get(url) response.raise_for_status() # 主动抛出HTTP请求错误 data = response.json() data_list.append(data) except requests.exceptions.RequestException as e: print(f"获取ID为{fruit_id}的水果数据失败: {e}") return data_list def listify(): fruit_data = scrape_all_fruits() for item in fruit_data: try: # 提取顶层字段 fruit_names.append(item['name']) fruit_ids.append(item['id']) families.append(item['family']) genera.append(item['genus']) orders.append(item['order']) # 提取嵌套在nutritions里的营养数据 nutritions = item['nutritions'] carbohydrates.append(nutritions['carbohydrates']) proteins.append(nutritions['protein']) fats.append(nutritions['fat']) calories.append(nutritions['calories']) sugars.append(nutritions['sugar']) except KeyError as e: print(f"数据字段缺失: {e}") continue # 执行函数并打印结果示例 listify() print("提取的脂肪数据:", fats)
关键修改说明
- 正确访问嵌套字段:先通过
item['nutritions']拿到营养子字典,再从中提取各个营养字段。 - 移除多余的JSON操作:直接使用
scrape_all_fruits()返回的字典列表,不需要转成JSON字符串再解析。 - 细化异常处理:只捕获
requests相关的请求异常和字段缺失的KeyError,并打印错误信息,方便排查问题。 - 优化变量名:把
id改成fruit_ids,避免和Python内置函数冲突,同时让变量名更具可读性。
内容的提问来源于stack exchange,提问作者DaB

