2014-05-22 10 views
5

Chciałbym wiedzieć, jak zignorować przedmioty, które nie wypełniają wszystkich pól, coś w rodzaju upuszczania, ponieważ w wynikach scrapydu dostaję strony, które nie wypełnić wszystkie pola.Scrapy jak ignorować przedmioty z pustymi polami za pomocą Loader

mam tego kodu:

class Product(scrapy.Item): 
    source_url = scrapy.Field(
     output_processor = TakeFirst() 
    ) 
    name = scrapy.Field(
     input_processor = MapCompose(remove_entities), 
     output_processor = TakeFirst() 
    ) 
    initial_price = scrapy.Field(
     input_processor = MapCompose(remove_entities, clear_price), 
     output_processor = TakeFirst() 
    ) 
    main_image_url = scrapy.Field(
     output_processor = TakeFirst() 
    ) 

Parser:

def parse_page(self, response): 
    try: 
     l = ItemLoader(item=Product(), response=response) 
     l.add_value('source_url', response.url) 
     l.add_css('name', 'h1.title-product::text') 
     l.add_css('main_image_url', 'div.pics a img.zoom::attr(src)') 

     l.add_css('initial_price', 'ul.precos li.preco_normal::text') 
     l.add_css('initial_price', 'ul.promocao li.preco_promocao::text') 

     return l.load_item() 

    except Exception as e: 
     print self.log("#1 ERRO: %s" % e), response.url 

Chcę to zrobić z ładowaczem bez konieczności tworzenia z własną Selector (aby uniknąć przetwarzania elementów dwukrotnie). Myślę, że mogę je upuścić, ale prawdopodobnie nie jest to najlepszy sposób, ponieważ te pozycje nie są poprawne.

+1

Zrzucanie przedmiotów w rurociągu nie jest złą drogą, wręcz przeciwnie - IMHO. –

Odpowiedz

8

Walidacja danych jest jednym z typowych przypadków użycia dla rurociągów. W twoim przypadku trzeba tylko napisać jakąś niewielką ilość kodu, aby sprawdzić wymagane pola, coś wzdłuż linii:

from scrapy.exceptions import DropItem 

class YourPersonalPipeline(object): 
    def process_item(self, item, spider): 
     required_fields = [] # your list of required fields 
     if all(field in item for field in required_fields): 
      return item 
     else: 
      raise DropItem("your reason") 

musisz włączyć rurociągu w settings.py Read more in scrapy docs.

Powiązane problemy