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

网页抓取项目中如何将字典键设为CSV列、值设为行的实现问询

解决Web Scraping结果导出CSV:字典键作为列名的实现

嘿,刚好我之前也踩过这个坑!你的现有代码是把整个字典当成单个单元格写入了,完全没发挥CSV的结构化优势。别担心,用Python自带的csv.DictWriter就能完美搞定这个需求,它就是专门为字典格式的数据设计的,上手超简单!

核心思路

我们需要实现两个关键目标:

  • 把所有字典的键作为CSV的表头(第一行)
  • 每个字典的值作为CSV的一行数据,和表头一一对应

修改后的完整代码示例

import csv

# --- 你的数据收集逻辑(这部分保持不变)---
mainlist = []
# 假设这是你抓取数据的循环,生成字典并添加到mainlist
# 比如:
# area = "某区域"
# district = "某城区"
# ... 其他变量赋值 ...
# data = { 
#     'address_area': area, 
#     'address_district': district, 
#     'website': website, 
#     'branch_rating': rating, 
#     'facilities_delivery': delivery, 
#     'facilities_banquet': banquet, 
#     'facilites_shisha': shisha, 
#     'faciliteis_minumum': minumium, 
#     'facilities_reservation': reservation, 
#     'facilities_free_wifi': wifi, 
#     'facilities_smoking_permited': smoking, 
#     'facilities_eat_out': eat_out, 
#     'facilities_private_parking': parking, 
#     'facilities_price_range': price_range, 
#     'facilities_kids_ares': kids_ares, 
#     'branch_no': branch_no
# }
# mainlist.append(data)

# --- 写入CSV的核心代码 ---
if mainlist:
    # 获取表头:取第一个字典的键(假设所有字典结构完全一致)
    fieldnames = mainlist[0].keys()
    
    # 打开文件,注意加newline=''避免Windows下空行,encoding='utf-8'防乱码
    with open('filetest.csv', 'w', newline='', encoding='utf-8') as f:
        # 初始化DictWriter,指定表头
        writer = csv.DictWriter(f, fieldnames=fieldnames)
        
        # 先写入表头(这一步必须调用!)
        writer.writeheader()
        
        # 遍历每个字典,写入一行数据
        for row_data in mainlist:
            writer.writerow(row_data)
else:
    print("警告:没有抓取到数据,无法生成CSV文件!")

关键细节说明

  1. 为什么选DictWriter?
    普通csv.Writer需要你手动构造每行的列表,还要严格保证顺序和表头一致,很容易出错。DictWriter会自动根据字典的键匹配表头的列,完全不用操心顺序问题。

  2. 不能漏的writeheader()
    这一步会把fieldnames里的键写入CSV的第一行(也就是表头),漏掉的话你的CSV就只有数据没有列名了。

  3. 参数避坑指南

    • newline='':这是Python官方文档推荐的参数,能避免Windows系统下写入CSV时出现多余的空行。
    • encoding='utf-8':如果你的抓取结果包含中文或特殊字符,这个参数能防止导出后出现乱码。
  4. 字典结构一致性
    要确保mainlist里的所有字典都有相同的键,如果某个字典缺少某个键,DictWriter会自动在对应的列填充空值(默认是空字符串),不会报错。

原来代码的问题所在

你之前用csv.writer然后writerow([value]),相当于把整个字典转换成字符串后塞进了CSV的一个单元格里,所以每行只有一个单元格,完全不是你想要的结构化数据。用DictWriter就能完美解决这个问题啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 17:43:13