当我知道该元素存在时,为什么我的脚本会引发 NoSuchElement 异常?

问题描述 投票:0回答:1

我编写了一个脚本,其中定义了一个“下一页”函数,该函数滚动到页面底部,识别“下一页”按钮,然后单击该按钮导航到下一页。请参阅我的脚本的以下摘录:

def next_page():
    browser.execute_script("window.scrollTo(0,document.body.scrollHeight);")
    sleep(1)

    try:
        next_button = browser.find_element(By.CLASS_NAME, 'bbsPager_next')
        next_button.click()

    except NoSuchElementException:
        print("Next button not found. End of pagination or element not loaded yet.")
        return False

    return True

稍后在我的脚本中,我将此函数作为 while True 循环的一部分调用,但它不断抛出 NoSuchElement 异常。奇怪的是我知道该元素存在,事实上,当我手动调用 next_page() 函数时,我能够成功导航到下一页。所以我知道该功能有效。我只是不明白为什么它在集成为整个脚本的一部分时不起作用。

我的总体目标是使用 Python Selenium 创建一个网络抓取工具,从目标网站的当前页面提取相关数据字段,然后自动导航到下一页并重复相同的过程,直到从所有可用页面提取数据。如上所述,我遇到的问题是,由于执行 next_page() 函数时引发 NoSuchElement 异常,我的“while True”循环不断中断。以下是我所指的 while True 循环的摘录:

while True:
    extract_page_data()
    navigation_successful = next_page()
    if not navigation_successful:
        print('No more pages left. Exiting...')
        break

我希望它从页面中提取数据,导航下一页并再次重复该过程,直到没有更多页面为止。但是,我收到的输出如下:

“未找到下一步按钮。分页结束或元素尚未加载。 没有更多的页面了。退出...”

任何帮助将不胜感激!谢谢!!

python selenium-webdriver web-scraping nosuchelementexception
1个回答
0
投票

我需要查看脚本的其余部分来确定地诊断问题,因为你说手动运行该函数是有效的。

但是,我可以预见的一个潜在问题是,当您在

while True
循环中运行该元素时,该元素可能不一定会加载并变得可点击。尝试像这样修改你的函数:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def next_page(browser):
    # Scroll to bottom of page in order for 'Next' button to be visible
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    sleep(1)

    try:
        # Wait for the 'Next' button to be clickable
        next_button = WebDriverWait(browser, 10).until(
            EC.element_to_be_clickable((By.CLASS_NAME, 'bbsPager_next'))
        )
        next_button.click()
        return True

    except NoSuchElementException as e:
        print(f"Next button not found. End of pagination or element not loaded yet. Details: {e}")
        return False
    except Exception as e:
        print(f"Unknown exception occured: {e}")
        return False
© www.soinside.com 2019 - 2024. All rights reserved.