Selenium Python触发UnexpectedAlertPresentException报错如何修改代码
问题解决方法
错误原因
- 核心报错是因为你预设的待爬URL列表中存在无效链接(比如ID为
1163693348的链接不符合站点的ID规则),访问无效页面时站点会弹出提示「대상을 찾을 수 없습니다(找不到目标)」的alert弹窗,Selenium未处理弹窗就执行后续元素查找操作,就会触发UnexpectedAlertPresentException异常。 - 代码本身还存在多处逻辑问题:
- 循环内重复修改
number变量值,会导致CSS选择器定位的行号错乱,甚至超出表格实际行数 - 没有设置页面元素等待逻辑,可能出现页面未加载完成就查找元素的报错
- 使用
list作为变量名,覆盖了Python内置的list关键字,属于不规范写法 - 没有做异常捕获逻辑,单次请求或元素查找失败就会导致整个程序终止
- 循环内重复修改
修复后的代码
import openpyxl from selenium import webdriver from bs4 import BeautifulSoup from selenium.webdriver.chrome.options import Options # 新增导入需要的工具类 from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from selenium.common.exceptions import NoAlertPresentException, TimeoutException, NoSuchElementException, UnexpectedAlertPresentException wb = openpyxl.Workbook() chrome_options = Options() sheet = wb.active sheet.append(["1lable", "2lable"]) wb.save("필름메이커스.xlsx") path = "/Users/KimJinwoo/Desktop/도구/파이썬 작업공간./chromedriver 2" driver = webdriver.Chrome(path) # 加隐式等待,全局生效 driver.implicitly_wait(10) driver.get('https://www.filmmakers.co.kr/actorsAudition/category/2343665') driver.find_element_by_name("user_id").send_keys("3434343") driver.find_element_by_name("password").send_keys("3434343") driver.find_element_by_css_selector("#fo_login_widget > button").click() driver.get('https://www.filmmakers.co.kr/actorsAudition/11445767?category=2343665') lost = ['https://www.filmmakers.co.kr/actorsAudition/11636208?category=2343665'] # 变量名改为url_list,避免覆盖内置关键字 url_list = ['https://www.filmmakers.co.kr/performerWanted/11638737/page/1?category=8294214' , 'https://www.filmmakers.co.kr/performerWanted/11637736/page/1?category=8294214' , 'https://www.filmmakers.co.kr/performerWanted/1163693348/page/1?category=8294214' , 'https://www.filmmakers.co.kr/performerWanted/11636933/page/1?category=8294214' , 'https://www.filmmakers.co.kr/performerWanted/11636543/page/1?category=8294214' , 'https://www.filmmakers.co.kr/performerWanted/11636508/page/1?category=8294214' , 'https://www.filmmakers.co.kr/performerWanted/11636231/page/1?category=8294214' , 'https://www.filmmakers.co.kr/performerWanted/11635838/page/1?category=8294214' , 'https://www.filmmakers.co.kr/performerWanted/11635747/page/1?category=8294214' , 'https://www.filmmakers.co.kr/performerWanted/11635719/page/1?category=8294214' , 'https://www.filmmakers.co.kr/performerWanted/11635657/page/1?category=8294214' , 'https://www.filmmakers.co.kr/performerWanted/11635481/page/1?category=8294214' , 'https://www.filmmakers.co.kr/performerWanted/11635371/page/1?category=8294214'] for url in url_list: try: driver.get(url) # 先处理可能出现的alert弹窗 try: alert = driver.switch_to.alert # 关闭弹窗 alert.accept() print(f"访问{url}时发现无效页面弹窗,已跳过") # 无效页面直接跳过后续爬取逻辑 continue except NoAlertPresentException: # 没有弹窗正常执行 pass # 先获取表格所有行,不要硬编码行数 tr_list = driver.find_elements_by_css_selector("#board_content > div.board > table.ui.unstackable.striped.celled.table > tbody > tr") for tr in tr_list: try: abc = tr.find_element(By.CSS_SELECTOR, "td.three.wide.text-bold") table = tr.find_element(By.CSS_SELECTOR, "td:nth-child(2)") t = abc.text b = table.text print(t,b) sheet.append([t,b]) except NoSuchElementException: # 单行元素查找失败跳过 continue # 每次爬完一个页面存一次 wb.save("필름메이커스1.xlsx") except Exception as e: print(f"访问{url}出现未知错误:{str(e)},已跳过") continue driver.quit() wb.close()
主要修改点
- 新增alert弹窗自动检测和关闭逻辑,访问无效页面弹出提示后会自动关闭并跳过该页面,不会中断程序
- 修复了循环行数的逻辑错误,改为先获取页面所有表格行再遍历,不会出现行号超出实际行数的问题
- 新增了多层异常捕获逻辑,单个页面、单行数据爬取失败都不会终止整个程序
- 新增了隐式等待,保证元素加载完成后再执行查找操作
- 修正了不规范的变量命名
- 新增了资源关闭逻辑,避免Excel文件损坏
内容的提问来源于stack exchange,提问作者김진우
相关产品推荐
相关产品推荐

