Python 如何防止我的脚本在第一次循环后中断?

Python 如何防止我的脚本在第一次循环后中断?,python,python-3.x,selenium,selenium-webdriver,web-scraping,Python,Python 3.x,Selenium,Selenium Webdriver,Web Scraping,我用python编写了一个脚本,使用selenium从网页中获取一些特定信息。由于该网页是保密的,我不能透露网站地址。无论如何,我希望我现有的刮板会点击网页20个链接中的每一个链接,到达所需的页面,它会收集信息并返回到前面的页面,重复相同的操作,直到所有的20个链接都用完。然而,刮板点击一个链接,转到所需页面解析信息,但不是返回主页重复操作,而是中断。我的循环过程似乎有问题。下面是我的脚本中的一些行,它们可能会给你一些想法,为我提供一个解决方法 for link in wait.until(EC

我用python编写了一个脚本,使用selenium从网页中获取一些特定信息。由于该网页是保密的,我不能透露网站地址。无论如何,我希望我现有的刮板会点击网页20个链接中的每一个链接,到达所需的页面,它会收集信息并返回到前面的页面,重复相同的操作,直到所有的20个链接都用完。然而,刮板点击一个链接,转到所需页面解析信息,但不是返回主页重复操作,而是中断。我的循环过程似乎有问题。下面是我的脚本中的一些行,它们可能会给你一些想法,为我提供一个解决方法

for link in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".section-result"))):  ##Supposed to loop through all the links
    link.click()   ##clicking each link

    name = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".section-info-text")))[2] ##this is where the document i want to parse from. The browser gets here when a click is executed 
    print(name.text) #after parsing the docs the code breaks instead of getting back to main page
请注意向右滚动,以查看附在每行上的最低说明。谢谢

这就是我的错误:

line 194, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document

如果代码没有返回到主页面,您可能需要执行一个返回到上一个(主页面)页面的命令,例如某种类型的后退按钮。我不是硒专家,但我使用过量角器(selenium的javascript包装器),也遇到过类似的问题。

问题本质上是这样的:

  • 您可以将所有链接作为WebElements进行迭代
  • 你开始你的循环
  • 您单击第一个链接,它会将您带到一个新页面,导致WebElements列表过时
  • 您尝试继续使用过时的WebElements,即使它们不再连接到任何东西
  • 您可以做些什么:

    伪码

    linkCount = getCountOfLinks();
    
    for x in range(0, linkCount-1):
        #Get all the links again fresh, and pick the next one each iteration
        link = getAllTheLinks[x]; 
    
        link.click();
    
        #the rest of your stuff
        name = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".section-info-text")))[2]  
    print(name.text)
    

    谢谢你的回答。在发布我的问题之前,我尝试在适当的位置使用
    driver.back()
    这个命令,但没有成功。还是一样。@Topto:在执行
    driver.back()
    之后,当您返回页面时,需要再次查找元素。你可以看看我最后的答案,以供参考。我想这条线索可能有用。我会让你知道的。