0
def parse_pagelist(self,response):
        for page in pageinfo:
            page_url=page['url']
            yield response.follow(page_url,self.parse_page)
        next_page=response.xpath('//ol[@class="page-main"]/li[last()]/a/@href').get()
        if next_page:
            return [response.follow(next_page,callback=self.parse_pagelist)]

在关于spider.parse的scrapy文档中它说:

此方法以及任何其他 Request 回调必须返回 >Request 和/或 item 对象的可迭代。

在这里我返回一个包含scrapy.Request的列表对象,但它永远不会下载,这是为什么呢?

4

2 回答 2

1

因为return向其调用者发送回一个特定的值,并且您的函数将在一次return后停止,而yield会产生一系列值,并且只有在没有更多值要产生时才会停止函数。

您可能想在此处阅读有关生成器的信息。

编辑:这是可能说明问题的示例:

def generate():
    for i in range(5):
        yield i
    return 15
result = [i for i in generate()]

变量的值result将是[0, 1, 2, 3, 4]

生成器使用__next__方法从下一次迭代中获取值,并且返回的值不包含在该迭代中。我希望这个例子对你有所帮助。

于 2020-09-15T02:19:52.210 回答
0

回调中的yield使您的回调作为迭代器工作。

您必须使用yield或返回一个列表。你不能将两者结合起来。

于 2020-09-16T12:24:37.920 回答