2016-05-16 31 views
4

我正在嘗試關注this tutorial爲什麼我的Scrapy中的輸入/輸出處理器不工作?

我想我的desc字段是一個標準化爲單個空格的單個字符串,並且是大寫字母。

dmoz_spider.py

import scrapy 
from tutorial.items import DmozItem 

class DmozSpider(scrapy.Spider): 
    name = "dmoz" 
    allowed_domains = ["dmoz.org"] 
    start_urls = [ 
     "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/", 
     "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/" 
    ] 

    def parse(self, response): 
     for sel in response.xpath('//ul/li'): 
      item = DmozItem() 
      item['title'] = sel.xpath('a/text()').extract() 
      item['link'] = sel.xpath('a/@href').extract() 
      item['desc'] = sel.xpath('text()').extract() 
      yield item 

我試圖宣佈根據http://doc.scrapy.org/en/latest/topics/loaders.html#declaring-input-and-output-processors

items.py

import scrapy 
from scrapy.loader.processors import MapCompose, Join 

class DmozItem(scrapy.Item): 
    title = scrapy.Field() 
    link = scrapy.Field() 
    desc = scrapy.Field(
     input_processor=MapCompose(
      lambda x: ' '.join(x.split()), 
      lambda x: x.upper() 
     ), 
     output_processor=Join() 
    ) 

但是輸入/輸出處理器,我的產量仍原來一樣這個。

{'desc': ['\r\n\t\r\n        ', 
      ' \r\n' 
      '\t\t\t\r\n' 
      '        - By David Mertz; Addison Wesley. ' 
      'Book in progress, full text, ASCII format. Asks for feedback. ' 
      '[author website, Gnosis Software, Inc.]\r\n' 
      '        \r\n' 
      '        ', 
      '\r\n        '], 
'link': ['http://gnosis.cx/TPiP/'], 
'title': ['Text Processing in Python']} 

我在做什麼錯?

我使用Python 3.5.1和1.1.0 Scrapy

我在這裏把我的整個代碼:https://github.com/prashcr/scrapy_tutorial,這樣你可以嘗試,並修改它,如你所願。

+0

什麼你預計會發生嗎? –

+0

我期待'desc'字段看起來像這樣:「 - BY DAVID MERTZ; ADDISON WESLEY。正在編寫,全文,ASCII格式。請求反饋。[作者網站,GNOSIS軟件公司]」 –

回答

4

但是,還有一個地方可以指定要使用的輸入和輸出處理器:在項目字段元數據中。

我懷疑的文件有誤導/錯誤(或者可能是過時的?),因爲,根據源代碼,input_processor場屬性讀取only inside the ItemLoader instance,這意味着你需要使用一個項目裝載機無論如何。

您可以使用內置的一個,並留下您的DmozItem定義是:

from scrapy.loader import ItemLoader 

class DmozSpider(scrapy.Spider): 
    # ... 

    def parse(self, response): 
     for sel in response.xpath('//ul/li'): 
      loader = ItemLoader(DmozItem(), selector=sel) 
      loader.add_xpath('title', 'a/text()') 
      loader.add_xpath('link', 'a/@href') 
      loader.add_xpath('desc', 'text()') 
      yield loader.load_item() 

這樣的input_processoroutput_processor項目現場論證會予以考慮,並且處理器將被應用。


或者你可以定義處理器的自定義項目裝載機而不是Item類中:

class DmozItem(scrapy.Item): 
    title = scrapy.Field() 
    link = scrapy.Field() 
    desc = scrapy.Field() 


class MyItemLoader(ItemLoader): 
    desc_in = MapCompose(
     lambda x: ' '.join(x.split()), 
     lambda x: x.upper() 
    ) 

    desc_out = Join() 

並用它來加載你的蜘蛛項目:

def parse(self, response): 
    for sel in response.xpath('//ul/li'): 
     loader = MyItemLoader(DmozItem(), selector=sel) 
     loader.add_xpath('title', 'a/text()') 
     loader.add_xpath('link', 'a/@href') 
     loader.add_xpath('desc', 'text()') 
     yield loader.load_item() 
+0

I看到。現在我看看它,我認爲「聲明輸入和輸出處理器」下的第二個代碼片段確實意味着需要使用ItemLoader,儘管它可能更加明確。 –

相關問題