StaleElementReferenceException

时间:2018-07-05 00:08:39

标签: python selenium scrapy

我已经在官方文档中了解了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 :(得分:1)

@Anthony,您的第二个带有links的代码块应该可以正常工作,就像您遇到复制/粘贴错误一样:

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

应该是

for link in links:
    browser.get(link)
    ... 

答案 1 :(得分:1)

正如文献所述:

在以下两种情况之一中会引发陈旧元素引用异常,第一种情况比第二种情况更常见:

  • 该元素已被完全删除。
  • 该元素不再附加到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)