Python如何从API返回的对象中提取对应字段信息
问题核心原因
你输出<object object 0x10a427f70>的根本原因是代码中处理details字段时,没有使用API返回的product['details']内容,反而手动创建了一个无意义的空object()对象存入列表,最终打印的只是这个空对象的内存地址。
同时你的代码存在两处可优化的逻辑问题:
- 对同一个
products列表循环了3次,完全可以合并为一次循环减少冗余 - 写入CSV的逻辑错误,你当前是把整个字段列表作为单个单元格写入,最终导出的CSV每一行只会有一个包含所有值的单元格,不符合常规CSV每一行对应一个产品的结构。
修复方案
步骤1:确认details结构
先在遍历products的代码中加入打印语句,查看API返回的details字段的实际结构:
print(type(product['details']), product['details'])
根据返回结构选择对应处理方式:
- 如果是单层字典/列表,直接转成JSON字符串存入CSV即可保留完整结构
- 如果需要提取
details内的特定字段,直接按键取值即可,比如product['details']['price']
步骤2:修改后的完整代码
import requests import csv import unicodedata import json # 新增导入,用于把对象转成JSON字符串 url = 'https://url.com/api/v2/products.json' user = '...' pwd = '...' csvfile = 'products.csv' # 初始化输出列表,每一个元素对应一行产品数据,第一行是表头 output = [ ["id", "created_at", "details"] ] while url: response = requests.get(url, auth=(user, pwd)) data = response.json() # 单次循环处理所有字段 for product in data['products']: # 处理id product_id = int(product['id']) # 处理创建时间 created_at = unicodedata.normalize('NFKD', product['created_at']).encode('ascii', 'ignore').decode('ascii') # 处理details,这里默认转成JSON字符串,需要提取特定字段可以自行修改 details = json.dumps(product['details'], ensure_ascii=False) # 加入输出行 output.append([product_id, created_at, details]) url = data['next_page'] print(f"下一页地址: {url}") print(f"共获取到 {len(output)-1} 条产品数据") # 写入CSV with open(csvfile, 'w', encoding='utf-8-sig', newline='') as fp: writer = csv.writer(fp, dialect='excel') writer.writerows(output) # 直接写入所有行
补充说明
- 如果你不需要保留
details的完整结构,只需要特定字段,把details = json.dumps(...)那一行替换成对应取值逻辑即可,比如你要取details里的spec字段,就写成details = product['details'].get('spec', '') - 写入CSV时加了
encoding='utf-8-sig'是为了兼容Excel打开中文不会乱码,newline=''是为了避免Windows下生成的CSV出现多余空行
内容的提问来源于stack exchange,提问作者ORCos
相关产品推荐
相关产品推荐

