我是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()
然后我从callback方法中产生这个项目,但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
如果我理解正确,这个方法应该从字符串的开头和结尾删除空格。如何正确使用?我是否需要编码并使用我的条带功能?
答案 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