Python 如何使用scrapy loader处理器实现长功能?

Python 如何使用scrapy loader处理器实现长功能?,python,web-scraping,scrapy,Python,Web Scraping,Scrapy,我开始使用项目加载器,在示例中使用mapcompose等加载器处理器来清理文本,例如: clean_text = Compose(MapCompose(lambda v: v.strip()), Join()) test = ['item1', 'item2', 'item3'] clean_text(test) 它返回: u'item1 item2 item3' 现在,我等待一个不同的输出,对于相同的输入,我需要用逗号分隔数据,因为我使用的是.csv文件,所以我也引用文本,以避免破坏

我开始使用项目加载器,在示例中使用mapcompose等加载器处理器来清理文本,例如:

clean_text = Compose(MapCompose(lambda v: v.strip()), Join())   
test = ['item1', 'item2', 'item3']
clean_text(test)
它返回:

u'item1 item2 item3'
现在,我等待一个不同的输出,对于相同的输入,我需要用逗号分隔数据,因为我使用的是.csv文件,所以我也引用文本,以避免破坏格式

'"""item1,item2,item3"""'
为此,我编写了以下函数:

def quote_field(text):
    text = ','.join([v.strip() for v in text ])
    return '"""' + text.strip() + '"""'
如何实现项目加载器

你们非常接近。 首先,您应该了解
Compose
mapcose
Compose
用于将某些函数应用于项目列表,而
mapcose
用于将某些函数应用于项目列表中的每个项目

所以你想要:

from scrapy.loader.processors import MapCompose, Compose, Join

clean_text = Compose(
    MapCompose(str.strip), # strip every item in list
    MapCompose(lambda item: f'"{item}"'),  # wrap every value in quotes
    Join(','),  # join all items in list as one using , as separator
)
如果您测试它:

test = ['item1', 'item2', 'item3']
clean_text(test)
#'item1,item2,item3'
你很接近。 首先,您应该了解
Compose
mapcose
Compose
用于将某些函数应用于项目列表,而
mapcose
用于将某些函数应用于项目列表中的每个项目

所以你想要:

from scrapy.loader.processors import MapCompose, Compose, Join

clean_text = Compose(
    MapCompose(str.strip), # strip every item in list
    MapCompose(lambda item: f'"{item}"'),  # wrap every value in quotes
    Join(','),  # join all items in list as one using , as separator
)
如果您测试它:

test = ['item1', 'item2', 'item3']
clean_text(test)
#'item1,item2,item3'

谢谢,但我还需要另外的引号:“'item1'、'item2'、'item3'”,因为它进入.CSVfile的on单元格。然后使用lambda func调用map compose。请参阅我的编辑。在这一点上,使用MapCompose而不是定义一个常规函数(如:quote_field)是否有意义?这完全取决于您如何构造代码库:)如果您觉得您需要此处理器之外的逻辑,那么定义一个特定函数是一个好主意!就我个人而言,我喜欢将所有处理器和处理器部件作为单独python模块中的函数,这样我就可以在不同的scrapy项目中重用它们,但这完全取决于您自己的喜好和舒适度。谢谢,但我还需要更多的引言:“item1”、“item2”、“item3”因为这会进入.CSVfile.com上的单元格,然后使用lambda func调用map compose。请参阅我的编辑。在这一点上,使用MapCompose而不是定义一个常规函数(如:quote_field)是否有意义?这完全取决于您如何构造代码库:)如果您觉得您需要此处理器之外的逻辑,那么定义一个特定函数是一个好主意!就我个人而言,我喜欢将所有处理器和处理器部件作为单独python模块中的函数,这样我就可以在不同的scrapy项目中重用它们,但这完全取决于您自己的喜好和舒适度。