首页 > 解决方案 > 为什么我不能在 Scrapy 中使用多个 yield 请求?

问题描述

我对 Scrapy 很陌生,只是想知道为什么我不能使用多个 yield 语句?

import scrapy

class CourseSpider(scrapy.Spider):
name = 'course'
start_urls = ['link.example']

def parse(self, response):
    syllabus = response.css('div#course_syllabus')
    title = response.css('title::text').get()
    image = syllabus.css('img::attr(src)').get()
    image_desc = syllabus.css('p::text')[1].get()
    desc = syllabus.css('p::text')[10].get()
    for i in (title, image, image_desc):
        yield {'course' : i}
        
    yield {'course_overview' : desc}

因此,当输出到 CSV 文件时,我得到了带有标题、图像和 image_desc 值的“课程”列,但是它根本没有将“课程概览”列添加到 csv 中。我只需要 1 个值,所以没有将它包含在 for 循环中。有人能帮我吗?谢谢。

标签: pythonpython-3.xscrapyyield

解决方案


多个管道可能有多个收益,但在这里您尝试将所有收益添加到 1 个收益中。如果你在 for 循环中只有一个项目,并且你想再添加 1 个列调用“course_overview”,你可以像这样使用 yield:

import scrapy

class CourseSpider(scrapy.Spider):
name = 'course'
start_urls = ['link.example']

def parse(self, response):
    syllabus = response.css('div#course_syllabus')
    title = response.css('title::text').get()
    image = syllabus.css('img::attr(src)').get()
    image_desc = syllabus.css('p::text')[1].get()
    desc = syllabus.css('p::text')[10].get()
    item = scrapy.Item()
    for i in (title, image, image_desc):
        item['course'] = i
        
    item['course_overview'] = desc
    yield item

您可以使用scrapy item 处理多个列,而不是双倍产量。


推荐阅读