【问题标题】:How To Remove White Space in Scrapy Spider Data如何删除 Scrapy Spider 数据中的空白
【发布时间】:2013-04-09 02:25:14
【问题描述】:

我正在用 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

【问题讨论】:

  • 查看this 示例蜘蛛代码。请注意parse 方法中如何使用处理器。希望对您有所帮助。

标签: web-scraping scrapy


【解决方案1】:

您可以在加载程序上使用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()

【讨论】:

  • ''.join(v.split()) 可以替换 v.strip() 如果您想删除所有空格,而不仅仅是从左侧和右侧。
【解决方案2】:

原来数据中也有很多空格,所以结合 Steven 的回答和更多的研究,可以让数据去掉所有的标签、回车和重复空格。工作代码如下。请注意在加载程序行上添加了 text() ,它删除了标签以及拆分和连接处理器以删除空格和行返回。

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        

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 2018-05-16
    • 2016-05-09
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多