Python Scrapy-TypeError:';请求';对象是不可编辑的

Python Scrapy-TypeError:';请求';对象是不可编辑的,python,scrapy,Python,Scrapy,我试图遍历从传递给scrapy请求的回调返回的URL列表,但我得到以下错误: TypeError: 'Request' object is not iterable 下面的工作。我可以在终端上看到所有提取的URL: import scrapy class PLSpider(scrapy.Spider): name = 'pl' start_urls = [ 'https://example.com' ] def genres(self, resp):

我试图遍历从传递给scrapy请求的回调返回的URL列表,但我得到以下错误:

TypeError: 'Request' object is not iterable
下面的工作。我可以在终端上看到所有提取的URL:

import scrapy

class PLSpider(scrapy.Spider):
    name = 'pl'
    start_urls = [ 'https://example.com' ]

    def genres(self, resp):
        for genre in resp.css('div.sub-menus a'):
            yield {
                'genre': genre.css('::text').extract_first(),
                'url': genre.css('::attr(href)').extract_first() 
            }

    def extractSamplePackURLs(self, resp):
        return {
            'packs': resp.css('h4.product-title a::attr(href)').extract()
        }

    def extractPackData(self, resp):
        return {
            'title': resp.css('h1.product-title::text'),
            'description': resp.css('div.single-product-description p').extract_first()
        }

    def parse(self, resp):
        for genre in self.genres(resp):
            samplePacks = scrapy.Request(genre['url'], callback=self.extractSamplePackURLs)
            yield samplePacks
但是如果我用以下内容替换
yield samplePacks
行:

    def parse(self, resp):
        for genre in self.genres(resp):
            samplePacks = scrapy.Request(genre['url'], callback=self.extractSamplePackURLs)
            for pack in samplePacks:
                yield pack
。。。我得到了我在上面发布的错误


这是为什么?我如何循环回调的返回值?

scrapy中生成
Request
对象。Spider
回调只告诉scrapy框架将HTTP请求排队。它生成HTTP请求对象,仅此而已。它不会立即下载它们。或者在下载之前归还控制权,也就是说,在收益之后,你仍然没有结果<代码>请求对象不是承诺、未来或延迟。Scrapy的设计与各种异步框架不同

这些
Request
对象最终将被框架的下载程序处理,来自每个HTTP请求的响应主体将被传递到相关的回调。 这是Scrapy异步编程模式的基础


如果您想做一些更“程序化”的事情,
yield request(…)
在下次拥有控制权时获取HTTP响应,您可以查看。

在回调函数中生成示例包数据。。。生成一个
请求
对象所做的就是添加另一个页面来使用相关的回调进行刮取-它的回调应该会生成(而不是返回)数据…SamplePack没有定义一个_iter_______;()以便不能对其进行迭代?我想我可能会在这里感到困惑。我原以为
Request
会从回调中返回列表?@JonClements如果我用
yield
替换返回值,我仍然会得到相同的错误。@bughnteruk请记住放弃一切。如果您在一次回调中向管道提供数据项,并且在另一次回调中从管道中提供更多请求,那么这很好。。。(例如,您访问一个页面并提取一个项目列表,然后生成在该页面上找到的请求链接,这些请求链接需要不同的回调来提取内容)