Возвращенный словарь из функции синтаксического анализа не сохраняется в выходных - PullRequest
0 голосов
/ 11 июля 2019

В моем классе пауков Scrapy у меня есть несколько функций для анализа различных типов 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. Почему это так?

1 Ответ

1 голос
/ 17 июля 2019

Когда вы используете yield в любом месте функции Python, возвращаемое значение этой функции становится generator, которое можно использовать для перебора значений, которые она выдает.

Хотя return data вВаш parse_variation обратный вызов является допустимым Python, он не делает то, что вы думаете, он делает.Это распространенная ошибка в Scrapy, настолько, что на самом деле есть предложение записать предупреждение, когда это происходит .

Переключите его на:

yield data
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...