Проверьте, все ли элементы из списка были отправлены на анализ - PullRequest
0 голосов
/ 29 марта 2020

Это пример кода:

boxes = sel.xpath("//div[@class='lister-item mode-advanced']")
for box in boxes:
    link = box.xpath(".//div[@class='lister-item-image float-left']/a/@href").extract_first()
    absolute_url = response.urljoin(link)
    yield SeleniumRequest(url=absolute_url, callback=self.parse_example)

Скажите, пожалуйста, как это сделать?

if all items (links from boxes) have been sent to self.parse_example: 
    ... do something 
else: 
    pass

Может быть, мне нужно использовать while? Если да, то как это сделать?

1 Ответ

1 голос
/ 29 марта 2020

Вы хотели бы использовать диктовку meta для передачи всех ссылок на обратный вызов, который затем выполнял бы действие, когда список пуст:

def thing_one():
    boxes = sel.xpath("//div[@class='lister-item mode-advanced']")
    box_urls = []
    for box in boxes:
        link = box.xpath(".//div[@class='lister-item-image float-left']/a/@href").extract_first()
        absolute_url = response.urljoin(link)
        box_urls.append(absolute_url)
    # use the first one to get started
    box0 = box_urls.pop()
    yield SeleniumRequest(url=box0, callback=self.parse_example,
                          meta={'box_urls': box_urls})

def parse_example(self, response):
     box_urls = response.meta.get('box_urls')
     if not box_urls:
         self.log('I have seen them all, now time for action!')

     box = box_urls.pop()
     yield SeleniumRequest(url=box, callback=self.parse_example,
                           meta={'box_urls': box_urls})

Это имеет неприятный побочный эффект заставляет их выполняться последовательно, но имеет приятный побочный эффект: не требуется никакой внешней системы координации, такой как база данных или хуже

...