Python Scrapy: как заставить CSVItemExporter писать столбцы в определенном порядке

В Scrapy у меня есть мои объекты, указанные в определенном порядке в items.py, и мой паук снова имеет эти элементы в том же порядке. Однако, когда я запускаю паука и сохраняю результаты как csv, порядок столбцов с items.py или паука не поддерживается. Как я могу получить CSV для отображения столбцов в определенном порядке. Пример кода будет очень оценен.

Спасибо.

Ответ 1

Это связано с Модификацией экспорта CSV в процессе скрининга

Проблема заключается в том, что экспортер создается без каких-либо параметров ключевого слова, поэтому ключевые слова, такие как 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',
]

Ответ 2

Я бы не знал о времени, когда вы задали свой вопрос, но теперь Scrapy предоставляет атрибут fields_to_export для класса BaseItemExporter, из которого наследуется CsvItemExporter. Согласно версии 0.22:

fields_to_export

Список с именем полей, которые будут экспортированы, или Нет, если вы хотите экспортировать все поля. По умолчанию "Нет".

     

Некоторые экспортеры (например, CsvItemExporter) уважают порядок   полей, определенных в этом атрибуте.

См. также документацию для BaseItemExporter и CsvItemExporter на веб-сайте Scrapy.

Чтобы использовать эту функцию, вам придется создать свою собственную ItemPipeline, как описано в этом ответе