我开始在scrapy中使用项目加载器,基本功能正常工作,如:
l.add_xpath('course_title', '//*[@class="course-header-ng__main-info__name__title"]//text()')
但是如果我想对这个项目应用一个功能,我在哪里定义这个功能?
在this问题上有一个例子:
from scrapy.loader.processors import Compose, MapCompose, Join, TakeFirst
clean_text = Compose(MapCompose(lambda v: v.strip()), Join())
to_int = Compose(TakeFirst(), int)
class MyItemLoader(ItemLoader):
default_item_class = MyItem
full_name_out = clean_text
bio_out = clean_text
age_out = to_int
weight_out = to_int
height_out = to_int
这是否取代了自定义模板?:
import scrapy
class MoocsItem(scrapy.Item):
# define the fields for your item here like:
description = scrapy.Field()
course_title = scrapy.Field()
我可以使用一个衬里的功能吗?
clean_text = Compose(MapCompose(lambda v: v.strip()), Join())
答案 0 :(得分:2)
有两种方法可以使用它。
方法1
您可以更改Item
课程,如下所示
class MoocsItem(scrapy.Item):
# define the fields for your item here like:
description = scrapy.Field()
course_title = scrapy.Field(output_processor=clean_text)
然后你会像下面那样使用它
from scrapy.loader import ItemLoader
l = ItemLoader(item=MoocsItem(), response=response)
l.add_xpath('course_title', '//*[@class="course-header-ng__main-info__name__title"]//text()')
item = l.load_item()
这当然会在回调中。
方法2
使用它来创建自己的装载程序的另一种方法
class MoocsItemLoader(ItemLoader):
default_item_class = MoocsItem
course_title_name_out = clean_text
然后你需要在下面的回调中使用加载器
from scrapy.loader import ItemLoader
l = MoocsItemLoader(response=response)
l.add_xpath('course_title', '//*[@class="course-header-ng__main-info__name__title"]//text()')
item = l.load_item()
正如您在此方法中所看到的,您不需要将创建的项目传递给