【问题标题】:Why can't I use multiple yield requests in Scrapy?为什么我不能在 Scrapy 中使用多个 yield 请求?
【发布时间】:2021-09-10 08:15:37
【问题描述】:

我对 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 循环中。有人能帮我吗?谢谢。

【问题讨论】:

    标签: python python-3.x scrapy yield


    【解决方案1】:

    多个管道可能有多个收益,但在这里您尝试将所有收益添加到 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 项目处理多列,而不是双倍产量。

    【讨论】:

      【解决方案2】:

      要为输出创建单个 cvs 文件,您必须使用单个产量请求。添加另一列尝试如下:

      PS:您的请求网址也不正确,请使用正确的方案更正。

      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,
                        'course_overview' : desc}
                  
      
        
      

      【讨论】:

        猜你喜欢
        • 2015-10-11
        • 2018-06-19
        • 2018-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-18
        • 2013-10-17
        相关资源
        最近更新 更多