2015-10-14 11 views
5

Ho spider Scrapy (versione 1.0.3) in cui estraggo sia alcuni dati dalla pagina Web che anche il file di download, come questo (semplificato):Durante il salvataggio di elementi e file raschiati, Scrapy inserisce righe vuote nel file csv di output

def extract_data(self, response): 
    title = response.xpath('//html/head/title/text()').extract()[0].strip() 
    my_item = MyItem() 
    my_item['title'] = title  

    file_url = response.xpath('...get url of file...') 
    file_urls = [file_url] # here there can be more urls, so I'm storing like a list 
    fi = FileItem() 
    fi['file_urls'] = file_urls 
    yield my_item 
    yield fi 

in pipelines.py ho solo l'override FilePipeline di cambiare il nome del file:

from scrapy.pipelines.files import FilesPipeline 

class CustomFilesPipeline(FilesPipeline): 
    def file_path(self, request, response=None, info=None): 
     filename = format_filename(request.url) 
     return filename 

in items.py ho:

class MyItem(scrapy.Item): 
    title = scrapy.Field() 

class FileItem(scrapy.Item): 
    file_urls = scrapy.Field() 
    files = scrapy.Field() 

in settings.py ho:

ITEM_PIPELINES = { 
    'myscraping.pipelines.CustomFilesPipeline': 100 
} 

ora in file CSV di output ottengo qualcosa di simile:

title1 
title2 
, 
, 
title3 
etc. 

Sembra che le linee vuote (avendo appena virgola) rappresenta il file e ho scaricato vorrebbe sapere o ricevere consigli su come impedire che tali righe siano nel file di output csv. (i file vengono salvati nella cartella).
Nelle impostazioni di Scrapy ho scoperto FEED_STORE_EMPTY (che per impostazione predefinita è falso, vale a dire non dovrebbe esportare feed vuoti) ma questo non si riferisce ai file che immagino.
Ho la sensazione che questo debba fare qualcosa con le condotte ma non riesco a capire come farlo.
qualsiasi aiuto sarebbe apprezzato

+2

perché non si fa a mettere file_urls nel vostro articolo MyItem(), e la resa solo un tipo di articolo? – vianney

+0

fantastico !!! Non ci avevo mai pensato (in qualche modo trascurato nella documentazione) :) grazie mille – zdenulo

risposta

0

incollo qui la risposta:

 
def extract_data(self, response): 
    title = response.xpath('//html/head/title/text()').extract()[0].strip() 
    my_item = MyItem() 
    my_item['title'] = title  
    file_url = response.xpath('...get url of file...') 
    my_item['file_urls'] = [file_url] 
    yield my_item