我是python的新手,所以我提前为可能愚蠢的问题道歉。我在使用默认项目加载器的处理器和相关问题时遇到了一些问题:
-
我使用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() 处理器?
-
在文档中,我看到了 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 中