2014-05-22 12 views
5

Tôi muốn biết cách bỏ qua các mục không điền vào tất cả các trường, một số loại bỏ, vì trong kết quả của scrapyd tôi nhận được các trang không điền vào tất cả các trường.Phế liệu cách bỏ qua các mục có trường trống bằng Trình tải

tôi có mã rằng:

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 

Tôi muốn làm điều đó với Loader mà không cần phải tạo ra với Selector của riêng tôi (để tránh mặt hàng chế biến hai lần). Tôi đoán rằng tôi có thể thả chúng vào đường ống nhưng có lẽ đó không phải là cách tốt nhất vì các mục này không hợp lệ.

+1

Việc bỏ các mục trong một đường ống không phải là một cách xấu, hoàn toàn là IMHO đối diện. –

Trả lời

8

Xác thực dữ liệu là một trong những trường hợp sử dụng điển hình cho đường ống. Trong trường hợp của bạn, bạn chỉ cần viết một số lượng nhỏ mã để kiểm tra các trường bắt buộc, một cái gì đó dọc theo dòng:

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

Bạn cần phải kích hoạt đường ống trong settings.py Read more in scrapy docs.

Các vấn đề liên quan