从解析函数返回的字典未存储在输出中

时间:2019-07-11 18:32:00

标签: scrapy

在Scrapy Spider类中,我有几个函数可以解析不同类型的URL。如果没有找到正则表达式搜索,它将直接以当前响应作为参数调用parse_product()函数,并从该函数返回数据,否则必须发送一个以parse_product()作为表单请求的表单回调。

问题在于,在第一种情况下数据不会进入输出。

在Scrapy文档中,它说我需要在回调函数中返回一个字典,以便在输出管道中执行该字典,但输出中仅包含else语句中的表单请求返回的项目。

   def parse_variation(self, response):
        self.logger.info("Parsing Variation")
        url_search = re.findall(variation_request_url_pattern, str(response.body))
        if not url_search:
            self.logger.info("URL SEARCH IS EMPTY")
            data = self.parse_product(response)
            #No Output with this statement
            return data
        else: 
            for url in url_search:
               yield FormRequest(url=url, body=body callback=self.parse_product)


    def parse_product(self, response):
        self.logger.info("Parsing Product")
        data = {}
        data["url"] = response.url
        data["name"] = response.xpath(title_xpath).extract_first()
        return data

只有else语句中Request的输出出现。为什么会这样?

1 个答案:

答案 0 :(得分:1)

当您在Python函数中的任何地方使用yield时,该函数的返回值将成为generator,可用于迭代其产生的值。

尽管return data回调中的parse_variation是有效的Python,但它并未执行您认为的操作。这是Scrapy中的一个常见错误,实际上有is a proposal to log a warning when it happens

将其切换到:

yield data