【问题标题】:Scrapy yields only the last elementScrapy 只产生最后一个元素
【发布时间】:2023-03-20 07:39:01
【问题描述】:

我在 scrapy 的帮助下收集了一些课程/课程,但它似乎只产生列表的 last 元素。
这是有问题的代码:

def parse_course_list(self, response):
    """ Scrape list of lessons for each course """
    lessons = response.css('ul.lessons-list a')
    for lesson in lessons:
        title = lesson.xpath("text()").extract_first().strip()
        link = lesson.xpath("@href").extract_first().strip()

        url = response.urljoin(link)
        item = response.meta['item']
        item['Lesson'] = title
        item['URL'] = link

        yield scrapy.Request(url, \
            callback=self.parse_lesson,
            meta={'item': item} \
        )

所以基本上我正在收集课程并产生对详细信息页面的请求。但是,parse_lesson 函数中的教训总是相同的。
我在这里完全遗漏了什么吗?

【问题讨论】:

    标签: python scrapy scrapy-spider


    【解决方案1】:

    啊……经典的指针问题!

    我不确定为什么会发生这种情况,除了您产生的请求在堆栈上携带具有相同地址的项目。

    解决方法如下:

    def parse_course_list(self, response):
        lessons = response.css('ul.lessons-list a')
        itemToCopy = response.meta['item']
        for lesson in lessons:
            item=itemToCopy.copy()
            ...
    

    剩下的就是显然减去item = response.meta['item']

    告诉我进展如何。

    【讨论】:

    • 一切顺利,muito obrigado :) 我在一行中做到了:item = reponse.meta['item'].copy(),没关系,不是吗?
    • 是的,我将声明和赋值分开以便更容易理解,很高兴它成功了 ;)
    猜你喜欢
    • 2020-09-25
    • 1970-01-01
    • 2021-05-16
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 2015-04-29
    相关资源
    最近更新 更多