Scrapy - 编码csv文件utf-8

时间:2017-08-09 03:33:40

标签: python csv encoding utf-8 scrapy

我浏览了这个网站,我在谷歌上做了同样的事情,但我没有发现在编码utf-8的csv文件中导出数据。

我需要对我的文件进行编码,因为我有一些法语字符(比如É)。 我使用CsvItemExporter,它通常已经在utf-8中编码,但它没有给我正确的字符。而不是这些char,我只有一些奇怪的东西,如\ A4ybzkzv,我不知道如何正确的。

我希望我已经足够清楚!!谢谢你的帮助......

这是我的pipelines.py:

# -*- coding: utf-8 -*-
from scrapy import signals
from scrapy.exporters import CsvItemExporter

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html

# Define your output file.
class FnacPipeline(CsvItemExporter):
    def __init__(self):
        self.files = {}

    @classmethod
    def from_crawler(cls, crawler):
        pipeline = cls()
        crawler.signals.connect(pipeline.spider_opened, signals.spider_opened)
        crawler.signals.connect(pipeline.spider_closed, signals.spider_closed)
        return pipeline

    def spider_opened(self, spider):
        f = open('..\\..\\..\\..\\Fnac.csv', 'w').close()
        file = open('..\\..\\..\\..\\Fnac.csv', 'w')
        self.files[spider] = file
        self.exporter = CsvItemExporter(file)
        self.exporter.start_exporting()

    def spider_closed(self, spider):
        self.exporter.finish_exporting()
        file = self.files.pop(spider)
        file.close()

    def process_item(self, item, spider):
        self.exporter.export_item(item)
        return item

有了这个管道,我有一个错误而不是正确的字符:TypeError: must be str, not bytes当我将file = open('..\\..\\..\\..\\Fnac.csv', 'w')更改为file = open('..\\..\\..\\..\\Fnac.csv', 'wb')时,我没有更多错误,但没有正确的字符..

我的输出: France métropolitaine

我想要的输出: France métropolitaine

3 个答案:

答案 0 :(得分:2)

使用Python 3使用utf-8编码打开文本文件进行书写的正确方法如下:

fd = open(path, mode='w', encoding='utf-8')
fd.write("Unicode string")

但是你的CsvItemExporter接缝要为你做编码,所以它会将二进制数据写入你的文件。因此,最好的方法是以二进制格式打开文件:

fd = open(path, mode='wb')
fd.write(b"Binary string")

结果:“法国m?tropolitaine”是正确的。问题是您没有使用正确的编辑器来读取您的文件。你当然使用Excel。 Excel默认在法语版本上使用cp1252打开CSV文件。您需要导入该文件才能选择源编码。注意:Libre Office不会出现此问题。

答案 1 :(得分:1)

所以正确答案是将其保存为utf-8并使用excel Import来查看该属性。

另一方面,您可以直接打开它在Excel中查看它,但默认编码为cp12523

对我来说,我不能告诉我的客户使用excel的Import,因此我选择将编码更改为cp1252,因此无法正确查看。

当您在settings.py中更改配置时,设置为FEED_EXPORT_ENCODING = 'utf-8'将无效。

我所做的是更改pipelines.py功能下的spider_opened

self.exporter = CsvItemExporter(file, encoding='cp1252')

答案 2 :(得分:0)

def open_spider(self, spider):
         self.csvfile  = open(self.filename, 'wb')
         self.exporter = CsvItemExporter(self.csvfile, encoding='utf-8-sig')
         self.exporter.start_exporting()