如何处理字典类型API响应?非标准JSON读取存储与CSV导出
问题根因
- 你调用的
analyze()返回值本身就是Python原生字典对象,不存在“非标准JSON”的问题。json.dump()的作用是把内存里的Python字典/列表序列化成JSON格式写入磁盘,要读取字段不需要先转成JSON文件再反向解析,直接操作返回的output字典对象即可。 - CSV写入失败有两个常见原因:一是你贴的代码里
json.dump()没有缩进,不在with open()的代码块内,会触发文件操作错误;二是pages列表内的单条数据存在嵌套结构(比如样例里的keywords是「[出现频次, 关键词文本]」组成的二维数组),CSV是纯二维表格格式,不支持直接写入嵌套的列表、字典类型,直接传值会报类型错误或者写入乱码。
字段读取方法
直接按键从字典里取值即可,不需要绕JSON文件中转:
site = 'http://www.micxxxxnk.com' output = analyze(site, analyze_headings=True, analyze_extra_tags=True) # 取所有页面数据,返回值是列表,每个元素对应一个页面的分析结果 all_pages = output["pages"] # 遍历读取单页字段示例 for page in all_pages: page_url = page["url"] page_title = page["title"] page_word_count = page["word_count"] # 嵌套字段按需处理,比如把关键词提取出来拼成字符串 keyword_list = [kw_pair[1] for kw_pair in page["keywords"]]
CSV导出正确实现
先把嵌套结构拍平成普通字符串、数字类型,再调用csv模块写入,注意文件参数配置避免乱码、空行问题:
import csv import json site = 'http://www.micxxxxnk.com' output = analyze(site, analyze_headings=True, analyze_extra_tags=True) all_pages = output["pages"] # 定义CSV导出列 csv_columns = ["url", "title", "description", "word_count", "keywords"] with open("seo_analyze_result.csv", "w", encoding="utf-8-sig", newline="") as csv_file: writer = csv.DictWriter(csv_file, fieldnames=csv_columns) writer.writeheader() for page in all_pages: # 处理嵌套的关键词字段,拼成逗号分隔的字符串 processed_keywords = ",".join([kw[1] for kw in page.get("keywords", [])]) # 构造写入行,缺字段时用默认值兜底,避免KeyError row = { "url": page.get("url", ""), "title": page.get("title", ""), "description": page.get("description", ""), "word_count": page.get("word_count", 0), "keywords": processed_keywords } writer.writerow(row) # 留存JSON备份,注意json.dump要放在with代码块内 with open("output.json", "w", encoding="utf-8") as json_file: json.dump(output, json_file, indent=4, ensure_ascii=False)
注意事项
- 写CSV时必须加
newline=""参数,否则导出的文件会隔行出现空行;用utf-8-sig编码是为了兼容Excel直接打开不出现中文乱码 - 字典取值优先用
get(键, 默认值)写法,避免API返回字段缺失时程序直接崩溃 - 后续要存数据库时,类似
keywords这种多值字段,要么拆成关联表存储,要么序列化成JSON字符串存字段,不要直接传入嵌套对象
内容的提问来源于stack exchange,提问作者Tori Elstrom
相关产品推荐
相关产品推荐

