Python Scrapy: как заставить CSVItemExporter записывать столбцы в определенном порядке - PullRequest
12 голосов
/ 04 августа 2011

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

Спасибо.

Ответы [ 2 ]

18 голосов
/ 19 сентября 2011

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

Проблема заключается в том, что экспортер создается без каких-либо параметров ключевых слов, поэтому такие ключевые слова, как EXPORT_FIELDS, игнорируются.Решение одно и то же: вам нужно создать подкласс для экспортера элементов CSV, чтобы передать параметры ключевого слова.

Следуя приведенному выше рецепту, я создал новый файл xyzzy / feedexport.py (замените «xyzzy» на то, что вам нужно)имя класса):

"""
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',
]
6 голосов
/ 18 января 2014

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

fields_to_export

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

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

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

Однако, чтобы использовать эту функцию, вам нужно будет создать свою собственную ItemPipeline, как описано в этого ответа

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...