StaleElementReferenceException - PullRequest
       7

StaleElementReferenceException

0 голосов
/ 05 июля 2018

Я читал о StaleElementReferenceException в официальной документации, но я все еще не понимаю, почему мой код вызывает это исключение? browser.get() создает новый паук?

class IndiegogoSpider(CrawlSpider):
    name = 'indiegogo'
    allowed_domains = [ 'indiegogo.com' ]
    start_urls = [ 'https://www.indiegogo.com/explore/all?project_type=all&project_timing=all&sort=trending' ]

    def parse(self, response):

        if (response.status != 404):
            options = Options()
            options.add_argument('-headless')
            browser = webdriver.Firefox(firefox_options=options)
            browser.get(self.start_urls[0])

            show_more = WebDriverWait(browser, 10).until(
                EC.element_to_be_clickable((By.XPATH, '//div[@class="text-center"]/a'))
            )

            while True:
                try:
                    show_more.click()
                except Exception:
                    break

            hrefs = WebDriverWait(browser, 60).until(
                EC.visibility_of_all_elements_located((By.XPATH, '//div[@class="discoverableCard"]/a'))
            )

            for href in hrefs:
                browser.get(href.get_attribute('href'))

                #
                # will be scraping individual pages here
                #


            browser.close()

Я пробовал следующее безрезультатно. Я также попытался поместить переменную links в другое место скрипта, в другой области, также безрезультатно.

            links = []

            for href in hrefs:
                links.append(href.get_attribute('href'))

            for link in links:
                browser.get(href.get_attribute('href'))

                #
                # will be scraping individual pages here
                #

Не знаете, почему hrefs и особенно links стираются из памяти? Когда я извлекаю значение атрибута href каждого элемента в итерируемом hrefs, а затем вставляю все URL-адреса в переменную links, разве список links не должен быть независимым от DOM и страницы? изменения?

Не уверен, что делать на этом этапе. Есть идеи?

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Как сказано в документации:

Исключение ссылки на устаревший элемент выдается в одном из двух случаев, причем первое является более распространенным, чем второе:

  • Элемент был полностью удален.
  • Элемент больше не привязан к DOM.

В вашем случае это:

  • Элемент больше не подключен к DOM.

Это из-за browser.get(href.get_attribute('href')). Когда вы перенаправляете на другую страницу, ваш DOM будет полностью перезагружен, и hrefs не ссылается на элементы с предыдущей страницы. Вот почему вы получаете ошибку.

Как бороться с этой ошибкой? Вы можете сделать так:

links = []

    for href in hrefs: # store all links as a strings
        links.append(href.get_attribute('href'))

    for link in links: # then just use them
        browser.get(link)
0 голосов
/ 05 июля 2018

@ Энтони, ваш второй блок кода с links должен работать, похоже, у вас ошибка копирования / вставки:

for link in links:
    browser.get(href.get_attribute('href'))

должно быть

for link in links:
    browser.get(link)
    ... 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...