我是 python 和 scrapy 的新手,所以我提前为可能愚蠢的问题道歉。我在使用默认项目加载器的处理器和相关问题时遇到了一些麻烦:
我使用 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() 处理器?
在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
如果我理解正确,此方法应该删除字符串开头和结尾的空格。如何正确使用?我是否需要编写代码并改为使用我的 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: global name 'unicode' is not defined - in Python 3
关于python - scrapy - 项目加载器 - 默认处理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46619150/