首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StaleElementReferenceException

StaleElementReferenceException
EN

Stack Overflow用户
提问于 2018-07-05 00:08:39
回答 2查看 260关注 0票数 1

我在官方文档中读过关于StaleElementReferenceException的文章,但我仍然不明白为什么我的代码会引发这种异常?browser.get()是否实例化了一个新的蜘蛛?

代码语言:javascript
复制
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变量放置在脚本的其他地方,在不同的范围内,也没有效果。

代码语言:javascript
复制
            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属性的值,然后将所有的URL放在links变量中时,links列表不应该独立于DOM和页面更改吗?

现在不知道该怎么做。有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-05 00:36:47

@Anthony,您使用links的第二个代码块应该可以工作,只是看起来您有一个复制/粘贴错误:

代码语言:javascript
复制
for link in links:
    browser.get(href.get_attribute('href'))

应该是

代码语言:javascript
复制
for link in links:
    browser.get(link)
    ... 
票数 1
EN

Stack Overflow用户

发布于 2018-07-05 00:38:03

正如文件所述:

在两种情况中的一种情况下抛出陈旧元素引用异常,第一种情况比第二种情况更常见:

  • 元素已被完全删除。
  • 元素不再附加到DOM。

就你而言,它是:

  • 元素不再附加到DOM。

这是因为browser.get(href.get_attribute('href'))。当您重定向到另一个页面时,您的DOM将被完全重新加载,并且hrefs不引用上一页中的元素。这就是为什么你会犯错误。

如何处理这个错误?你可以这样做:

代码语言:javascript
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51181949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档