2011-08-04 6 views
12

En Scrapy, tengo mis artículos especificados en cierto orden en items.py, & mi araña tiene esos artículos nuevamente en el mismo orden. Sin embargo, cuando ejecuto la araña & guardo los resultados como un csv, el orden de columnas de items.py o la araña no se mantiene. ¿Cómo puedo obtener el CSV para mostrar columnas en un orden específico? El código de ejemplo sería muy apreciado.Python Scrapy: Cómo obtener CSVItemExporter para escribir columnas en un orden específico

Gracias.

Respuesta

18

esto está relacionado con Modifiying CSV export in scrapy

El problema es que el exportador se crea una instancia sin ningún parámetro de palabras clave, por lo que las palabras clave como EXPORT_FIELDS son ignorados. La solución es la misma: debe crear una subclase del exportador de elementos de CSV para pasar los parámetros de palabra clave.

Siguiendo la receta anterior, he creado un nuevo archivo XYZZY/feedexport.py (modificar "XYZZY" a cualquiera que sea su clase scrapy se nombra):

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

y luego se añadió al XYZZY/settings.py :

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

Ahora el exportador CSV honren al entorno EXPORT_FIELD - también se suman a 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

veo este post ya es bastante antiguo. ¿Se ha resuelto este problema de una manera más simple en una versión más reciente? – not2qubit

+0

Sí, ver la respuesta siguiente – Toilal

5

no sabría sobre el tiempo que le pide su pregunta, pero Scrapy ahora proporciona un fields_to_export atributo a la claseBaseItemExporter, de la que CsvItemExporter hereda. De acuerdo con la versión 0.22:

fields_to_export

una lista con el nombre de los campos que se van a exportar, o ninguno si desea exportar todos los campos. El valor predeterminado es Ninguno.

Algunos exportadores (como CsvItemExporter) respetan el orden de los campos definidos en este atributo.

Véase también la documentación para BaseItemExporter y CsvItemExporter en el sitio web Scrapy.

Para utilizar esta característica, sin embargo, tendrá que crear su propia ItemPipeline, como se detalla en this answer

+0

¡Esta es la mejor respuesta ahora! Gracias – Toilal

Cuestiones relacionadas