2011-08-04 8 views
12

W Scrapy, mam moje produkty określone w określonej kolejności w items.py, & mój pająk ma te przedmioty ponownie w tej samej kolejności. Jednak po uruchomieniu pająka & zapisz wyniki jako CSV, kolejność kolumn z items.py lub pająka nie jest zachowywana. Jak mogę uzyskać CSV, aby wyświetlał kolumny w określonej kolejności. Przykładowy kod byłby bardzo doceniany.Python Scrapy: Jak uzyskać CSVItemExporter do zapisywania kolumn w określonej kolejności

Dzięki.

Odpowiedz

18

Wiąże się to Modifiying CSV export in scrapy

Problem polega na tym, że eksporter jest tworzony bez żadnych parametrów słów kluczowych, więc słowa kluczowe, takie jak EXPORT_FIELDS są ignorowane. Rozwiązanie jest takie samo: musisz podklasę eksportera elementów CSV, aby przekazać parametry słów kluczowych.

następstwie powyższego przepisu, stworzyłem nowy plik xyzzy/feedexport.py (zmiana "xyzzy", aby niezależnie od klasy scrapy nazywa):

""" 
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) 

i dodaje go do xyzzy/settings.py :

FEED_EXPORTERS = { 
    'csv': 'xyzzy.feedexport.CSVkwItemExporter' 
} 

teraz eksporter CSV uhonoruje ustawienie EXPORT_FIELD - również dodać do 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', 
] 
+3

widzę ten post jest już dość stary. Czy ten problem został rozwiązany w prostszy sposób w nowszej wersji? – not2qubit

+0

Tak, zobacz następną odpowiedź – Toilal

5

nie wiem o czas poprosił Cię pytanie ale Scrapy zapewnia teraz fields_to_export atrybut do BaseItemExporter klasy, z której CsvItemExporter dziedziczy. Zgodnie wersji 0.22:

fields_to_export

lista z nazwą pola, które będą eksportowane lub None, jeśli chcesz wyeksportować wszystkie pola. Domyślne ustawienie to Brak.

Niektórzy eksporterzy (np. CsvItemExporter) przestrzegają zamówienia pól zdefiniowanych w tym atrybucie.

Zobacz także dokumentację BaseItemExporter i CsvItemExporter na stronie Scrapy.

Aby korzystać z tej funkcji, choć trzeba będzie stworzyć własny ItemPipeline, jak wyszczególniono w this answer

+0

To jest teraz najlepsza odpowiedź! dzięki – Toilal