You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

遍历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)

关键修改说明

  1. 正确访问嵌套字段:先通过item['nutritions']拿到营养子字典,再从中提取各个营养字段。
  2. 移除多余的JSON操作:直接使用scrape_all_fruits()返回的字典列表,不需要转成JSON字符串再解析。
  3. 细化异常处理:只捕获requests相关的请求异常和字段缺失的KeyError,并打印错误信息,方便排查问题。
  4. 优化变量名:把id改成fruit_ids,避免和Python内置函数冲突,同时让变量名更具可读性。

内容的提问来源于stack exchange,提问作者DaB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 13:42:32