【问题标题】:scrapy - item loader - default processorsscrapy - 项目加载器 - 默认处理器
【发布时间】:2018-03-19 01:14:33
【问题描述】:

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

    然后我从回调方法产生这个项目,但是 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() 中的项目加载器中使用它时,我得到了错误:

    NameError: name 'unicode' is not defined
    

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

【问题讨论】:

    标签: python scrapy


    【解决方案1】:

    那是因为文档使用的是 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

    【讨论】:

    • 谢谢你的回答,但你能解释一下我的第一个问题吗?如果需要,我可以提供有关问题的更多信息。
    • 因为您没有添加输出处理器。添加default_output_processor = TakeFirst()然后试试
    • default_input_processor 不能在没有 default_output_processor 的情况下工作?我想使用另一个处理器作为 default_output_processor,我可以使用 TakeFirst() 作为 default_input_processor,如果不是,为什么?
    • 就是这样写的。 if processed_value: self._values[field_name] += arg_to_iter(processed_value)。应用输入过程后,它会转换回数组,以便您可以应用输出处理器。因为处理器将假设输入仅作为一个数组。
    猜你喜欢
    • 2016-10-08
    • 2014-10-03
    • 2021-06-02
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    相关资源
    最近更新 更多