如何在未找到元素时终止Selenium循环并执行后续代码?
问题描述
我是Hugo,正在爬取一个没有下一页按钮的网站,通过修改URL中的页码来实现爬取。目前用循环遍历URL列表的方式运行正常,但每周条目数量会变化,URL列表里存在多余地址,希望当某页找不到目标HTML元素时,立刻停止遍历后续URL,直接执行导出数据的Pandas代码。比如第20页没条目,就跳过21-25页,直接导出。
之前尝试的问题
- 第一种方法无效果:
find_elements方法找不到元素时不会抛出NoSuchElementException,只会返回空列表,所以外层的try-except捕获不到异常,循环会继续执行。 - 第二种方法报语法错误:
break写在except块里,不在循环内部,Python不允许在循环外使用break,因此报错。
正确实现方式
核心思路:每次爬取后检查获取到的元素列表是否为空,为空就直接跳出循环;同时把异常处理放到循环内部,应对页面加载失败等其他错误。
import random from time import sleep from selenium import webdriver import pandas as pd from datetime import datetime from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from selenium.common.exceptions import WebDriverException driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) listawebs = [ 'https://www.***page=1', 'https://www.***page=2', # ... 补充其他页码URL 'https://www.***page=25' ] lista_todo = [] for url in listawebs: try: driver.get(url) sleep(random.uniform(0, 1)) # 获取目标元素列表 todo_elements = driver.find_elements("xpath", './/div[@data-test="mms-search-srp-productlist-item"]') if not todo_elements: # 元素列表为空,说明当前页无条目 print(f"页面 {url} 无目标条目,停止爬取") break # 提取文本并添加到总列表 todo_texts = [elem.text for elem in todo_elements] lista_todo.extend(todo_texts) print(f"成功爬取页面 {url},共获取 {len(todo_texts)} 条数据") except WebDriverException as e: print(f"爬取页面 {url} 时出错: {str(e)}") break # 遇到错误也停止爬取,若想跳过错误页继续爬,可改为continue # 导出数据到CSV df = pd.DataFrame({"nombre": lista_todo}) now = datetime.now() currentDateTime = now.strftime("%m-%d-%Y %H-%M-%S %p") df.to_csv(f"file_name {currentDateTime}.csv", encoding='utf-8-sig') driver.quit()
关键说明
- 判断无条目的核心逻辑:用
if not todo_elements检查元素列表是否为空,这比捕获异常更准确,因为find_elements找不到元素时不会抛出异常。 - 修复语法错误:把
try-except放到循环内部,break处于循环范围内,不会再触发语法错误。 - 增加调试日志:打印每一页的爬取状态,方便快速定位停止的页码。
内容的提问来源于stack exchange,提问作者Hugo
相关产品推荐
相关产品推荐

