From cf35e09d35205db940261754147b2511aedf484b Mon Sep 17 00:00:00 2001 From: Ping Yin Date: Fri, 23 Apr 2010 01:28:57 +0800 Subject: [PATCH] ItemLoader: don't limit item to Item object Now, for example, item can be a dict Signed-off-by: Ping Yin --- scrapy/contrib/loader/__init__.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/scrapy/contrib/loader/__init__.py b/scrapy/contrib/loader/__init__.py index 175862901..88493b5d3 100644 --- a/scrapy/contrib/loader/__init__.py +++ b/scrapy/contrib/loader/__init__.py @@ -51,14 +51,14 @@ class ItemLoader(object): def get_input_processor(self, field_name): proc = getattr(self, '%s_in' % field_name, None) if not proc: - proc = self.item.fields[field_name].get('input_processor', \ + proc = self._get_item_field_attr(field_name, 'input_processor', \ self.default_input_processor) return proc def get_output_processor(self, field_name): proc = getattr(self, '%s_out' % field_name, None) if not proc: - proc = self.item.fields[field_name].get('output_processor', \ + proc = self._get_item_field_attr(field_name, 'output_processor', \ self.default_output_processor) return proc @@ -67,6 +67,12 @@ class ItemLoader(object): proc = wrap_loader_context(proc, self.context) return proc(value) + def _get_item_field_attr(self, field_name, key, default=None): + if isinstance(self.item, Item): + value = self.item.fields[field_name].get(key, default) + else: + value = default + return value class XPathItemLoader(ItemLoader):