这有效:
text_in = clean_list
$ ['','text','', 'text2'] <--- example output
这不是:
text_in = Compose(clean_list, stop_on_none=False)
$ TypeError: clean_list() missing 1 required positional argument: 'values'
文档:
class scrapy.loader.processors.Compose(*functions, **default_loader_context)
根据给定的组成构造的处理器 功能。这意味着该处理器的每个输入值为 传递给第一个函数,该函数的结果是 传递给第二个函数,依此类推,直到最后一个函数 返回此处理器的输出值。 默认情况下,停止对
None
值的处理。可以通过传递关键字参数stop_on_none=False
来更改此行为。
出了什么问题?最初的论点消失在哪里?
useritems.py
def not_empty(self, values):
return values if values else None
def clean_list(self, values):
return x.something() if not_empty(values) else None
class UserItem(scrapy.loader.Item):
text = scrapy.Field()
class UserLoader(scrapy.loader.ItemLoader):
default_input_processor = clean_list
text_in = Compose(clean_list)
__ init __。py
class UserSpider(scrapy.Spider):
#init settings
def parse(self, response):
results = response.xpath(xpath1)
for result in results.css("li"):
loader = UserLoader(item=UserItem(), selector=result)
nest = loader.nested_xpath(xpath2)
nest.add_xpath("text", xpath3) # eg = ['','text','', 'text2']
yield loader.load_item()