Python爬虫输出CSV文件时汉字显示为乱码,如何解决?
32 位 WINDOWS7,PYTHON3 环境下。用这样的命令将爬到的结果输出到 CSV 文件: scrapy crawl 爬虫名 -o result.csv
这个文件用 EDITPLUS 或写字板打开都能正常显示其中的汉字,但是直接双击 CSV 文件用 EXCEL 打开时其中的汉字却都是乱码,请问这个要如何解决呢?感谢指点!
Python爬虫输出CSV文件时汉字显示为乱码,如何解决?
Bom
这个问题很常见,主要是编码问题。CSV默认用utf-8编码写入,但Excel打开时可能默认用系统本地编码(比如中文Windows的gbk或gb2312),导致乱码。
最直接的解决方案是:在写入CSV文件时,明确指定编码为utf-8-sig。
utf-8-sig会在文件开头写入一个BOM(字节顺序标记),这个标记能帮助Excel等软件自动识别文件为UTF-8编码,从而正确显示中文。
下面是一个完整的示例代码:
import csv
# 你的数据,假设包含中文
data = [
['姓名', '城市', '备注'],
['张三', '北京', '测试数据'],
['李四', '上海', '另一个测试']
]
# 关键:使用 newline='' 防止空行,并用 encoding='utf-8-sig' 指定编码
with open('output.csv', 'w', newline='', encoding='utf-8-sig') as f:
writer = csv.writer(f)
writer.writerows(data)
print("CSV文件已生成,使用Excel打开应能正常显示中文。")
如果数据来自网络爬虫(比如用requests库),通常也需要在获取响应时指定正确的编码:
import requests
import csv
url = '你的目标网址'
response = requests.get(url)
# 确保网页编码正确,常见的中文编码是 'utf-8' 或 'gbk'
response.encoding = 'utf-8' # 或根据实际情况调整为 'gbk', 'gb2312'
html_text = response.text
# ... 这里用你的解析方法(如BeautifulSoup)从html_text中提取数据 ...
parsed_data = [['标题', '内容'], ['示例标题', '示例中文内容']]
# 写入CSV时同样使用 utf-8-sig
with open('scraped_data.csv', 'w', newline='', encoding='utf-8-sig') as f:
writer = csv.writer(f)
writer.writerows(parsed_data)
总结一下关键点:
- 写入文件时:
open('file.csv', 'w', encoding='utf-8-sig') - 读取网页时:设置
response.encoding为正确的源编码。
如果还不行,检查一下你的数据源本身是不是就已经是乱码了。用utf-8-sig基本能解决99%的Excel中文乱码问题。
一句话建议:写入CSV时用encoding='utf-8-sig'。
编码格式改为 utf-8?
-- coding: utf8-bom -- ? 这么写不对呢
命令行模式用什么参数可以转 GBK 呢?
excel 用导入,高级,然后选 utf-8
utf-8-sig
文件格式选系统默认
EXCEL 导入时手工处理是可以的
这个是在哪里选呢? EXCEL 导入时么?那就是 UTF-8 了
用记事本打开,另存为 utf-8 格式
excel 打开 csv 默认 ansi 编码 所以你只能通过 excel 重新导入逗号分隔文本 然后生成 xls
这是 excel 的问题,百度:excel 导入 csv 文件
我不懂 py,我用 c#写的爬虫方式是本地写入文件时候,需要和操作系统的文件格式一致
用 Python2 爬 HTML 页面或者爬到数据库然后导出到 csv 还没遇到过这种问题呢。我都是先 sys.setdefaultencoding(‘utf-8’)
微软的软件打开文件默认都是 ANSI 编码(国内就是 GBK),UTF-8 的 csv 文件在 execl 中打开时解码自然就乱码了,在 WINDOWS 中识别 UTF-8 需要在前面添加 BOM(16 进制的:EF BB BF ),或者选择导入的方式(里面可以选择编码)。
excel 新建表单导入 csv,编码选择 UTF-8,直接双击不行
utf-8 without boom
-- coding: utf-8-sig -- ? 程序中这么写无效呢
PYTHON3 下好像就不能用 sys.setdefaultencoding(‘utf-8’)了
iconv -f utf-8 -t gbk yourfile > your_gbk_file
貌似简单的方法就是记事本打开以后,在另存成 utf-8 就可以。
excel 会根据有没有 BOM 确定文件是不是 UTF8 编码,否则它假设内容使用 windows codepage 编码。
这种情况只需要重新保存文本为 utf-8 with bom 就没有乱码了。


