ItemLoader не передает контекст загрузчика процессорам ввода - PullRequest
0 голосов
/ 19 июня 2019

мой паук: 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), (' item ', {})])

items.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: [('селектор', [2019-06-12 08:59 <'>]), (' ответ ', нет), (' item ', {})]

Почему в loader_context нет "context"?

1 Ответ

0 голосов
/ 20 июня 2019
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()")
...