在Scrapy中,我在items.py,&中按特定顺序指定了我的项目。我的蜘蛛再次以相同的顺序拥有这些物品。但是,当我运行蜘蛛&将结果保存为csv,不保留items.py或spider中的列顺序。如何让CSV以特定顺序显示列。示例代码将非常感激。
感谢。
答案 0 :(得分:18)
这与Modifiying CSV export in scrapy
有关问题是导出器是在没有任何关键字参数的情况下实例化的,因此会忽略EXPORT_FIELDS之类的关键字。解决方案是相同的:您需要子类化CSV项导出器以传递关键字参数。
按照上面的方法,我创建了一个新文件xyzzy / feedexport.py(将“xyzzy”改为你的scrapy类命名):
"""
The standard CSVItemExporter class does not pass the kwargs through to the
CSV writer, resulting in EXPORT_FIELDS and EXPORT_ENCODING being ignored
(EXPORT_EMPTY is not used by CSV).
"""
from scrapy.conf import settings
from scrapy.contrib.exporter import CsvItemExporter
class CSVkwItemExporter(CsvItemExporter):
def __init__(self, *args, **kwargs):
kwargs['fields_to_export'] = settings.getlist('EXPORT_FIELDS') or None
kwargs['encoding'] = settings.get('EXPORT_ENCODING', 'utf-8')
super(CSVkwItemExporter, self).__init__(*args, **kwargs)
然后将其添加到xyzzy / settings.py中:
FEED_EXPORTERS = {
'csv': 'xyzzy.feedexport.CSVkwItemExporter'
}
现在,CSV导出器将遵循EXPORT_FIELD设置 - 同时添加到xyzzy / settings.py:
# By specifying the fields to export, the CSV export honors the order
# rather than using a random order.
EXPORT_FIELDS = [
'field1',
'field2',
'field3',
]
答案 1 :(得分:6)
我不知道您提出问题的时间,但Scrapy现在为 BaseItemExporter 类提供 fields_to_export 属性, CsvItemExporter 继承。 根据版本0.22:
<强> fields_to_export 强>
包含要导出的字段名称的列表,如果要导出所有字段,则为None。默认为无。
某些出口商(例如 CsvItemExporter )尊重订单 此属性中定义的字段。
另请参阅Scrapy网站上的BaseItemExporter和CsvItemExporter文档。
但是,要使用此功能,您必须创建自己的ItemPipeline,详见this answer