2016-05-16 11 views
4

私はthis tutorialに従おうとしています。Scrapyの入出力プロセッサが動作しないのはなぜですか?

私のdescフィールドは、単一のスペースに正規化された単一の文字列で、大文字にします。私はしかし、私の出力はまだのように判明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() 
    ) 

に応じて、入力/出力プロセッサを宣言しようとした

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 

この。

{'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。進行中の予約、フルテキスト、アスキーフォーマット。[AUTHOR WEBSITE、GNOSIS SOFTWARE、INC。] " –

答えて

4

ただし、使用する入力プロセッサと出力プロセッサを指定できるもう1つの場所がアイテムフィールドのメタデータです。あなたが項目Loaderを使用する必要があることを意味

私はドキュメントが間違っ/誤解を招く疑い(または古くなっている可能性があり?)、ソースコードによると、input_processorフィールド属性がonly inside the ItemLoader instance読まれる、ので、とにかく

あなたは1を内蔵しているとして、あなたの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

見る。ここでは、「入力と出力のプロセッサを宣言する」の2番目のコードスニペットは、より明示的ではあるが、ItemLoaderも使用する必要があると考えていると思う。 –

関連する問題