我在官方文档中读过关于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属性的值,然后将所有的URL放在links变量中时,links列表不应该独立于DOM和页面更改吗?
现在不知道该怎么做。有什么想法吗?
发布于 2018-07-05 00:36:47
@Anthony,您使用links的第二个代码块应该可以工作,只是看起来您有一个复制/粘贴错误:
for link in links:
browser.get(href.get_attribute('href'))应该是
for link in links:
browser.get(link)
... 发布于 2018-07-05 00:38:03
正如文件所述:
在两种情况中的一种情况下抛出陈旧元素引用异常,第一种情况比第二种情况更常见:
就你而言,它是:
这是因为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)https://stackoverflow.com/questions/51181949
复制相似问题