在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的输出出现。为什么会这样?
答案 0 :(得分:1)
当您在Python函数中的任何地方使用yield
时,该函数的返回值将成为generator
,可用于迭代其产生的值。
尽管return data
回调中的parse_variation
是有效的Python,但它并未执行您认为的操作。这是Scrapy中的一个常见错误,实际上有is a proposal to log a warning when it happens。
将其切换到:
yield data