我想知道如何忽略未填写所有字段的项目,某种丢弃,因为在 scrapyd 的输出中我得到的页面未填写所有字段。
我有那个代码:
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()
)
解析器:
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
我想用 Loader 来完成它,而不需要用我自己的 Selector 创建(以避免处理项目两次)。我想我可以将它们放在管道中,但这可能不是最好的方法,因为这些项目无效。
最佳答案
数据验证是管道的典型用例之一。在您的情况下,您只需要编写一些少量代码来检查必填字段,大致如下:
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")
您需要在 settings.py 中启用管道 Read more in scrapy docs .
关于python - Scrapy 如何使用 Loader 忽略带有空白字段的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23810650/