首页 > 解决方案 > ItemLoader 不会将加载器上下文传递给输入处理器

问题描述

我的蜘蛛:autospd.py

class AutospdSpider(scrapy.Spider):
    name = 'autospd'
    start_urls = ['http://news.dayoo.com/guangzhou/150960_2.shtml']
    dt_ft = "%Y-%m-%d %H:%M"

    def parse(self, response):
        list_objs = response.css("div.dy-list>div")

        for li in list_objs:
            loader = AutopjtItemLoader(item=AutopjtItem(), selector=li, context=self.dt_ft)

            print(loader.context.items())  #please see print-1

            loader.nested_css("h2>a").add_css("title", "::text")
            loader.nested_css("h2>a").add_css("url", "::attr(href)")
            loader.nested_css("div.txt-area>div.news-time").add_xpath("pub_time", "string()")

            yield loader.load_item()

print-1: dict_items([('context', '%Y-%m-%d %H:%M'), ('selector', \r\n '>), ('response', None), ('物品', {}) ])

项目.py

def func(value, loader_context):
    print(loader_context.items())  # please see print-2
    # ft = loader_context.get("context")
    # time_dt = datetime.strptime(value, ft)
    return value


class AutopjtItemLoader(ItemLoader):
    default_output_processor = TakeFirst()

    pub_time_in = MapCompose(func)


class AutopjtItem(scrapy.Item):
    title = scrapy.Field()
    url = scrapy.Field()
    pub_time = scrapy.Field()

print-2: [('selector', [2019-06-12 08:59<'>]), ('response', None), ('item', {})]

为什么 loader_context 中没有“上下文”?

标签: scrapypython-3.6

解决方案


def nested_xpath(self, xpath, **context):
    selector = self.selector.xpath(xpath)
    context.update(selector=selector)
    subloader = self.__class__(
        item=self.item, parent=self, **context
    )
    return subloader

def nested_css(self, css, **context):
    selector = self.selector.css(css)
    context.update(selector=selector)
    subloader = self.__class__(
        item=self.item, parent=self, **context
    )
    return subloader

从scrapy 的源代码中,如果你使用nested_css 或nested_xpath,你必须添加你的上下文。例如:

loader.nested_css("div.txt-area>div.news-time", dt_ft=self.dt_ft).add_xpath("pub_time", "string()")

推荐阅读