项目加载器 - 默认处理器



我是python的新手,所以我提前为可能愚蠢的问题道歉。我在使用默认项目加载器的处理器和相关问题时遇到了一些问题:

  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()
    

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

  2. 在文档中,我看到了 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() 的项目加载器中使用它时,出现错误:

    NameError: name 'unicode' is not defined
    

    如果我理解正确,此方法应该从字符串的开头和结尾删除空格。如何正确使用它?我需要编码并使用我的 strip 函数吗?

这是因为文档使用的是 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:全局名称"unicode"未定义 - 在 Python 3 中

最新更新