【问题标题】:where to define item custom item loaders in scrapy?在scrapy中在哪里定义项目自定义项目加载器?
【发布时间】:2018-04-22 02:13:54
【问题描述】:

我开始在 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())

【问题讨论】:

标签: python web-scraping scrapy


【解决方案1】:

有两种使用方法。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多