我正在用Scrapy编写我的第一个spider,并尝试遵循文档。我已经实现了ItemLoaders。spider程序提取数据,但是数据包含许多行返回。我尝试了多种方法来删除它们,但是似乎没有任何效果。replace_escape_chars实用程序应该可以使用,但是我不知道如何在中使用它ItemLoader。也有人使用(unicode.strip),但同样,我似乎无法使其正常工作。有些人试图在items.py中使用它们,而其他人则试图在spider中使用它们。如何清除这些行返回(\ r \ n)的数据?我的items.py文件仅包含项目名称和field()。spider代码如下:
ItemLoader
from scrapy.spider import BaseSpider from scrapy.selector import HtmlXPathSelector from scrapy.contrib.loader import XPathItemLoader from scrapy.utils.markup import replace_escape_chars from ccpstore.items import Greenhouse class GreenhouseSpider(BaseSpider): name = "greenhouse" allowed_domains = ["domain.com"] start_urls = [ "http://www.domain.com", ] def parse(self, response): items = [] l = XPathItemLoader(item=Greenhouse(), response=response) l.add_xpath('name', '//div[@class="product_name"]') l.add_xpath('title', '//h1') l.add_xpath('usage', '//li[@id="ctl18_ctl00_rptProductAttributes_ctl00_liItem"]') l.add_xpath('repeat', '//li[@id="ctl18_ctl00_rptProductAttributes_ctl02_liItem"]') l.add_xpath('direction', '//li[@id="ctl18_ctl00_rptProductAttributes_ctl03_liItem"]') items.append(l.load_item()) return items
事实证明,数据中还存在许多空格,因此结合Steven的回答和更多研究后,数据就可以删除所有标记,行返回和重复的空格。工作代码如下。请注意,在加载程序行上添加了text(),它删除了标记,并且split and join处理器删除了空格和行返回。
def parse(self, response): items = [] l = XPathItemLoader(item=Greenhouse(), response=response) l.default_input_processor = MapCompose(lambda v: v.split(), replace_escape_chars) l.default_output_processor = Join() l.add_xpath('title', '//h1/text()') l.add_xpath('usage', '//li[@id="ctl18_ctl00_rptProductAttributes_ctl00_liItem"]/text()') l.add_xpath('repeat', '//li[@id="ctl18_ctl00_rptProductAttributes_ctl02_liItem"]/text()') l.add_xpath('direction', '//li[@id="ctl18_ctl00_rptProductAttributes_ctl03_liItem"]/text()') items.append(l.load_item()) return items
你可以default_output_processor在加载器上使用,也可以在各个字段上使用其他处理器,请参见title:
default_output_processor
title
from scrapy.spider import BaseSpider from scrapy.contrib.loader import XPathItemLoader from scrapy.contrib.loader.processor import Compose, MapCompose from w3lib.html import replace_escape_chars, remove_tags from ccpstore.items import Greenhouse class GreenhouseSpider(BaseSpider): name = "greenhouse" allowed_domains = ["domain.com"] start_urls = ["http://www.domain.com"] def parse(self, response): l = XPathItemLoader(Greenhouse(), response=response) l.default_output_processor = MapCompose(lambda v: v.strip(), replace_escape_chars) l.add_xpath('name', '//div[@class="product_name"]') l.add_xpath('title', '//h1', Compose(remove_tags)) l.add_xpath('usage', '//li[@id="ctl18_ctl00_rptProductAttributes_ctl00_liItem"]') l.add_xpath('repeat', '//li[@id="ctl18_ctl00_rptProductAttributes_ctl02_liItem"]') l.add_xpath('direction', '//li[@id="ctl18_ctl00_rptProductAttributes_ctl03_liItem"]')