我按照 https://scrapeops.io/python-scrapy-playbook/scrapy-beginners-guide-cleaning-data/ 的教程来设置 scrapy itemloader。但是,我不明白如何修改项目加载器以返回列表中的所有元素而不仅仅是第一个元素。
我可以使用以下代码获取必要的数据:
print(''.join(data.xpath(".//text()").extract()))
在不使用 itemloader 或 ''.join 的情况下打印数据会给出: [“针对先前接受过治疗的参与者的长期研究”、“Ciltacabtagene”、“Autoleucel”]
项目加载器给出: 针对之前接受过治疗的参与者的长期研究
上面的打印返回: 针对先前接受 Ciltacabtagene Autoleucel 治疗的参与者的长期研究
itemloader.py
from itemloaders.processors import TakeFirst, MapCompose, Join
from scrapy.loader import ItemLoader
class DataLoader(ItemLoader):
default_output_processor = TakeFirst()
title_in = MapCompose(lambda x: x)
如何修改 itemloaders.py 以返回必要的数据?
您的输出是一个项目的原因是因为
default_output_processor = TakeFirst()
行根据名称选择输出列表中的第一项。第一个选项是使用不同的默认输出处理器,例如 Join()
或 Identity
或根据您的用例自定义函数。第二个选项是为特定字段定义适当的输出处理器,例如要使用 Join()
使用空格连接标题提取器的输出,您可以为标题定义一个输出处理器,如下所示(注意命名约定 <field_name>_out
)。
from itemloaders.processors import TakeFirst, MapCompose, Join
from scrapy.loader import ItemLoader
class DataLoader(ItemLoader):
default_output_processor = TakeFirst()
title_in = MapCompose(lambda x: x)
title_out = Join()