scrapy - 项目加载器 - 默认处理器

时间:2017-10-07 10:25:18

标签: python scrapy

我是python和scrapy的新手,所以我提前为可能愚蠢的问题道歉。我对默认项目加载器的处理器和相关问题有些麻烦:

  1. 我使用default_input_processor变量从使用TakeFirst()处理器的列表中提取第一个值:

    class    CaseLoader(scrapy.loader.ItemLoader):
        default_input_processor = TakeFirst()
    

    和用法:

      def load_row_data(self, row):
          cl = CaseLoader(CaseItem(), row)
    
          cl.add_xpath('case_num',  './/td[1]/a/text()')
          cl.add_xpath('case_link', './/td[1]/a/@href')
          cl.add_xpath('name',      './/td[3]/text()')
          return cl.load_item()
    

    然后我从callback方法中产生这个项目,但TakeFirst()不起作用,我得到一个列表而不是字符串。如果我使用TakeFist()作为default_output_processor,它可以工作。 default_input_processor如何工作?为什么在这种情况下不应用TakeFisrt()处理器?

  2. documentation中,我看到了unicode.strip方法的用法:

    from scrapy.loader import ItemLoader
    from scrapy.loader.processors import TakeFirst, MapCompose, Join
    
    class ProductLoader(ItemLoader):
    
        default_output_processor = TakeFirst()
    
        name_in = MapCompose(unicode.title)
        name_out = Join()
    
        rice_in = MapCompose(unicode.strip)
    
        # ...
    

    但是当我尝试在Compose()的Item Loader中使用它时,我收到错误:

    NameError: name 'unicode' is not defined
    

    如果我理解正确,这个方法应该从字符串的开头和结尾删除空格。如何正确使用?我是否需要编码并使用我的条带功能?

1 个答案:

答案 0 :(得分:4)

这是因为文档使用的是Python2,而您使用的是Python3

Python3中没有unicode。您应该使用str代替

class ProductLoader(ItemLoader):

    default_output_processor = TakeFirst()

    name_in = MapCompose(str.title)
    name_out = Join()

    rice_in = MapCompose(str.strip)

有关更多信息,请参阅以下主题

NameError: global name 'unicode' is not defined - in Python 3