Python Scrapy:Itemloader处理器/方法类型错误:';ItemMeta';对象不可下标

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

我正在尝试构建一个函数(clean_键盘)以在扩展的Itemloader类中使用。 它应该过滤和清理扩展项目类“category”=“Notebook”中的数据。 我已经在没有“笔记本电脑”->(如果ProductItem['category']=='Notebook':)过滤器的情况下对其进行了测试,并且处理器/方法在没有过滤器的情况下工作正常。但是在插入这段过滤代码之后,我在标题中得到了上面的TypeError。请参阅下面的代码


### 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选择器收集的项目填充的,请参阅