Python 在scrapy中在何处定义项目自定义项目加载器?

Python 在scrapy中在何处定义项目自定义项目加载器?,python,web-scraping,scrapy,Python,Web Scraping,Scrapy,我开始在scrapy中使用项目加载器,基本功能运行良好,如: l.add_xpath('course_title', '//*[@class="course-header-ng__main-info__name__title"]//text()') 但是如果我想对这个项目应用函数,我应该在哪里定义函数呢 关于这个问题,有一个例子: from scrapy.loader.processors import Compose, MapCompose, Join, TakeFirst clean_te

我开始在scrapy中使用项目加载器,基本功能运行良好,如:

l.add_xpath('course_title', '//*[@class="course-header-ng__main-info__name__title"]//text()')
但是如果我想对这个项目应用函数,我应该在哪里定义函数呢

关于这个问题,有一个例子:

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())

有两种方法可以使用它

方法1

您可以像下面这样更改
项目

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()
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()
然后你会像下面那样使用它

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()
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()
这当然是在回调中

方法2

使用它创建自己的加载程序的另一种方法

class MoocsItemLoader(ItemLoader):
    default_item_class = MoocsItem
    course_title_name_out = clean_text
然后您需要在如下回调中使用loader

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()
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()

正如您在这种方法中所看到的,您不需要将创建的项传递给它

,您将把它分配给您创建的加载器,