2015-10-14 32 views
5

Mam spider Scrapy (wersja 1.0.3), w którym wyodrębniam zarówno niektóre dane ze strony internetowej, jak i pobieram plik w ten sposób (uproszczony):Podczas zapisywania zeskanowanego przedmiotu i pliku, Scrapy wstawia puste wiersze w wyjściowym pliku csv

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 

w pipelines.py po prostu zastąpić FilePipeline zmienić nazwę pliku:

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 

w items.py mam:

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

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

w settings.py mam:

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

teraz w wyjściowym pliku csv mam coś takiego:

title1 
title2 
, 
, 
title3 
etc. 

Wygląda na to, że puste linie (mający tylko przecinek) reprezentuje pobrany plik i I Chciałbym wiedzieć lub uzyskać poradę, jak zapobiec, aby takie linie były w wyjściowym pliku csv. (pliki są zapisywane w folderze).
W ustawieniach Scrapy dowiedziałem się o FEED_STORE_EMPTY (co jest domyślnie fałszywe, tzn. Nie powinno eksportować pustych kanałów), ale nie jest to związane z plikami, jak sądzę.
Mam wrażenie, że to musi coś zrobić z potokami, ale nie mogę wymyślić, jak to zrobić.
Każda pomoc będzie mile widziane

+2

dlaczego nie można umieścić file_urls w pozycji MyItem(), a tylko wydajność jednego rodzaju sprzęcie? – vianney

+0

niesamowite !!! Nigdy o tym nie myślałem (jakoś przeoczyłem w dokumentacji) :) wielkie dzięki – zdenulo

Odpowiedz

0

wkleić odpowiedź tutaj:

 
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