网页抓取项目中如何将字典键设为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文件!")
关键细节说明
为什么选
DictWriter?
普通csv.Writer需要你手动构造每行的列表,还要严格保证顺序和表头一致,很容易出错。DictWriter会自动根据字典的键匹配表头的列,完全不用操心顺序问题。不能漏的
writeheader()
这一步会把fieldnames里的键写入CSV的第一行(也就是表头),漏掉的话你的CSV就只有数据没有列名了。参数避坑指南
newline='':这是Python官方文档推荐的参数,能避免Windows系统下写入CSV时出现多余的空行。encoding='utf-8':如果你的抓取结果包含中文或特殊字符,这个参数能防止导出后出现乱码。
字典结构一致性
要确保mainlist里的所有字典都有相同的键,如果某个字典缺少某个键,DictWriter会自动在对应的列填充空值(默认是空字符串),不会报错。
原来代码的问题所在
你之前用csv.writer然后writerow([value]),相当于把整个字典转换成字符串后塞进了CSV的一个单元格里,所以每行只有一个单元格,完全不是你想要的结构化数据。用DictWriter就能完美解决这个问题啦!
内容的提问来源于stack exchange,提问作者OKOCHA
相关产品推荐
相关产品推荐

