Python Scrapy:Itemloader处理器/方法类型错误:';ItemMeta';对象不可下标
我正在尝试构建一个函数(clean_键盘)以在扩展的Itemloader类中使用。 它应该过滤和清理扩展项目类“category”=“Notebook”中的数据。 我已经在没有“笔记本电脑”->(如果ProductItem['category']=='Notebook':)过滤器的情况下对其进行了测试,并且处理器/方法在没有过滤器的情况下工作正常。但是在插入这段过滤代码之后,我在标题中得到了上面的TypeError。请参阅下面的代码Python Scrapy:Itemloader处理器/方法类型错误:';ItemMeta';对象不可下标,python,python-3.x,scrapy,Python,Python 3.x,Scrapy,我正在尝试构建一个函数(clean_键盘)以在扩展的Itemloader类中使用。 它应该过滤和清理扩展项目类“category”=“Notebook”中的数据。 我已经在没有“笔记本电脑”->(如果ProductItem['category']=='Notebook':)过滤器的情况下对其进行了测试,并且处理器/方法在没有过滤器的情况下工作正常。但是在插入这段过滤代码之后,我在标题中得到了上面的TypeError。请参阅下面的代码 ### processor method for clean
### processor method for cleaning data with the Itemloader, Item and Itemloader class extended
def clean_keyboard(pattern):
keyboard_dict = {'deutsch': 'DE', 'US-QWERTY': 'US', '': 'DE'}
if ProductItem['category'] == 'Notebook': # <-- TypeError when adding category filter, without it works fine
if pattern in keyboard_dict:
return keyboard_dict[pattern]
else:
return pattern
class ProductItem(scrapy.Item):
category = scrapy.Field()
keyboard = scrapy.Field()
class SpiderItemLoader(ItemLoader):
default_item_class = ProductItem
default_input_processor = MapCompose(str.strip)
default_output_processor = TakeFirst()
keyboard_out = MapCompose(clean_keyboard)
### Parse Method in the Spider to get the data/ using the SpiderItemloader extended class
def parse_item(self, response):
l = SpiderItemLoader(response = response)
l.add_xpath('keyboard', '//*[@class="short-description"]/p/strong[text()="keyboard"]/following-sibling::text()')
l.add_xpath('category', '//*[@class="short-description"]/p/strong[text()="category"]/following-sibling::text()'')
return l.load_item()
###使用Itemloader、Item和Itemloader类扩展清理数据的处理器方法
def清洁键盘(模式):
键盘_dict={'deutsch':'DE','US-QWERTY':'US','DE'}
如果ProductItem['category']='Notebook':#如Daniel所评论,那么失败的一行毫无意义。您想检查正在处理的项目的“category”属性,但是您的clean_键盘
功能无法访问该属性ProductItem
是所有项共享的类,而不是特定项
项目加载器处理器无法访问项目,只能访问这些项目的特定属性
我建议您使用一个而不是项目加载器处理器来实现clean_键盘
功能的逻辑。事实上,感谢你们两位通过类访问帮助我理解这一点(项目加载器与项目管道)
因此,由于我确实可以访问项目管道中的项目,所以我能够通过使用项目管道访问其他项目来解决过滤问题。请参阅我的测试代码和下面的解决方案
# Configure item pipelines in settings.py
ITEM_PIPELINES = {
'tutorial.pipelines.DataCleaningPipeline': 300,
}
# Pipeline in pipelines.py
class DataCleaningPipeline(object):
def process_item(self, item, spider):
keyboard_dict = {'deutsch': 'DE', 'US-QWERTY': 'US', '': 'DE', 'QWERTZ': 'DE'}
dict_key = item.get('keyboard')
category = item.get('category')
if 'Notebook' in category and dict_key in keyboard_dict:
item['keyboard']= keyboard_dict[dict_key]
return item
else:
return item
ProductItem是一个类。假设您需要一个实例,然后您可以通过product\u item.category
访问它。嗨,Daniel,您能提供一些与上述方法代码相关的代码示例吗,谢谢,因为我对Scrapy一无所知。但我认为你的代码没有任何意义。相关的ProductItem应该来自哪里?没问题,谢谢。但它确实有意义,因为它在没有类别过滤器的情况下工作。->ProductItem是从使用Spider选择器收集的项目填充的,请参阅