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

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

Спасибо.

12 голосов | спросил user818190 4 PM00000070000005931 2011, 19:03:59

2 ответа


0

Это связано с Модификацией экспорта CSV в 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',
]
ответил gvb 19 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 19 Sep 2011 06:11:08 +0400 2011, 06:11:08
0

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

  

fields_to_export

     
    

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

         

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

  

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

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

ответил beniguet 18 Jpm1000000pmSat, 18 Jan 2014 16:53:07 +040014 2014, 16:53:07

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132