如何在Scrapy爬虫数据中去除空格

5

我正在使用Scrapy编写我的第一个爬虫,并尝试遵循文档。我已经实现了ItemLoaders。这个爬虫提取数据,但是数据包含许多换行符。我尝试过很多方法来删除它们,但没有任何效果。replace_escape_chars实用程序应该可以工作,但我不知道如何与ItemLoader一起使用它。有些人使用(unicode.strip),但是我似乎无法让它正常工作。有些人尝试在items.py中使用它们,而另一些人则在爬虫中使用它们。我应该如何清除这些换行符(\r\n)的数据?我的items.py文件只包含项目名称和field()。以下是爬虫代码:

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

请查看此示例爬虫代码。请注意在parse方法中如何使用处理器。希望这有所帮助。 - alecxe
2个回答

7

您可以在加载器上使用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"]')

        return l.load_item()

1
''.join(v.split()) 可以替代 v.strip(),如果你想要移除所有的空格而不仅仅是左右两侧。 - Umair A.

3
事实证明,数据中还有许多空白处。因此,结合Steven的答案和更多研究,可以删除数据中的所有标签、行返回和重复空格。下面是工作代码。请注意,在loader行中增加了text()函数,以删除标签,并使用split和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        

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接