2017-01-21 11 views
0

意向/期待される動作Scrapy:アイテム・ローダーとKeyError例外キーが定義されていても

戻るページからのリンクのテキスト:CSV形式でシェルでhttps://www.bezrealitky.cz/vypis/nabidka-prodej/byt/praha

。私はitem.py itemloaderでキーが定義されているにもかかわらず、 'タイトル':

エラーは、私はKeyError例外を取得します。

フルトレースバック

Traceback (most recent call last): 
    File "C:\Users\phili\Anaconda3\envs\py35\lib\site-packages\scrapy\utils\defer.py", line 102, in iter_errback 
    yield next(it) 
    File "C:\Users\phili\Anaconda3\envs\py35\lib\site-packages\scrapy\spidermiddlewares\offsite.py", line 29, in process_spider_output 
    for x in result: 
    File "C:\Users\phili\Anaconda3\envs\py35\lib\site-packages\scrapy\spidermiddlewares\referer.py", line 22, in <genexpr> 
    return (_set_referer(r) for r in result or()) 
    File "C:\Users\phili\Anaconda3\envs\py35\lib\site-packages\scrapy\spidermiddlewares\urllength.py", line 37, in <genexpr> 
    return (r for r in result or() if _filter(r)) 
    File "C:\Users\phili\Anaconda3\envs\py35\lib\site-packages\scrapy\spidermiddlewares\depth.py", line 58, in <genexpr> 
    return (r for r in result or() if _filter(r)) 
    File "C:\Users\phili\Documents\Python Scripts\Scrapy Spiders\bezrealitky\bezrealitky\spiders\bezrealitky_spider.py", line 33, in parse 
    yield loader.load_item() 
    File "C:\Users\phili\Anaconda3\envs\py35\lib\site-packages\scrapy\loader\__init__.py", line 115, in load_item 
    value = self.get_output_value(field_name) 
    File "C:\Users\phili\Anaconda3\envs\py35\lib\site-packages\scrapy\loader\__init__.py", line 122, in get_output_value 
    proc = self.get_output_processor(field_name) 
    File "C:\Users\phili\Anaconda3\envs\py35\lib\site-packages\scrapy\loader\__init__.py", line 144, in get_output_processor 
    self.default_output_processor) 
    File "C:\Users\phili\Anaconda3\envs\py35\lib\site-packages\scrapy\loader\__init__.py", line 154, in _get_item_field_attr 
    value = self.item.fields[field_name].get(key, default) 
KeyError: 'title' 

Spider.py

DEF構文解析(自己、応答):

for records in response.xpath('//*[starts-with(@class,"record")]'): 
    loader = BaseItemLoader(selector=records) 
    loader.add_xpath('title', './/div[@class="details"]/h2/a[@href]/text()') 
    yield loader.load_item() 

Item.py - Itemloader

class BaseItemLoader(ItemLoader): 
    title_in = MapCompose(unidecode) 

結論

私はScrapyマニュアルに従い、アイテムローダーと「title_in」によってキーを定義したと思うと、途方に暮れて少しですが、その後、私はそれに値を得たときに私はKeyErrorを取得します。私は、Xpathが私が望むテキストを提供していることをシェルでチェックしているので、少なくとも動作しています。いくつかの助けを得ることを望んでいる!

答えて

0

あなたがItemLoaderを使用する場合でも、あなたが最初Itemクラスを定義し、アイテムローダはローダのプロパティとしてそれを定義のいずれかにそれを渡す必要があります。

class CustomItemLoader(ItemLoader): 
    default_item_class = MyItem 

またはローダのコンストラクタにそのインスタンスを渡す:

l = CustomItemLoader(item=Item()) 

それ以外の場合、アイテムローダーはアイテムとそのフィールドについて何も知らない。

+0

多くのありがとうmizhgun、それは働いた!実際の項目を定義するitems.pyには別のクラスを用意し、実際のitemloaderは別のクラスにする必要がありました。あなたのヒントをすべてクリックして、ありがとう! – Svarto

関連する問題