2013-04-16 116 views
4

我正在Scrapy中編寫我的第一個蜘蛛並嘗試關注文檔。我已經實現了ItemLoaders。蜘蛛提取數據,但數據包含許多行返回。我嘗試了很多方法來刪除它們,但似乎沒有任何工作。 replace_escape_chars工具應該可以工作,但我無法弄清楚如何將它與ItemLoader一起使用。還有一些人使用(unicode.strip),但再次,我似乎無法得到它的工作。有些人試圖在items.py和蜘蛛中的其他人中使用它們。我如何清理這些行返回的數據(\ r \ n)?我的items.py文件只包含項目名稱和字段()。蜘蛛代碼如下:如何刪除Scrapy蜘蛛數據中的空白區域

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 
+0

見[此](https://github.com/econchick/new-coder/blob/master/scrape/living_social/living_social/spiders/livingsocial_spider.py)樣品蜘蛛代碼。注意'parse'方法中如何使用處理器。希望有所幫助。 – alecxe

回答

3

事實證明,也有許多空白的數據,所以將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   
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() 
+0

''.join(v.split())可以替換v.strip(),如果你想刪除所有的空格,而不僅僅是從左側和右側。 – Neutralizer