如何绕过Selenium爬虫的「无法定位元素」NoSuchElementException异常?
解决方法
你遇到的NoSuchElementException是Selenium找不到目标元素时的默认抛出异常,要让程序不中断,需要捕获该异常并做兼容处理,同时建议增加元素等待逻辑避免页面未加载完成导致的误判。
具体修改点
- 提前导入
NoSuchElementException异常类,以及显式等待相关工具类 - 用
try...except代码块包裹元素查找逻辑,元素不存在时给价格设置默认值(如N/A) - 增加显式等待逻辑,优先等待元素加载完成,提高抓取成功率
- 所有导入语句统一放在代码顶部,符合Python编码规范
修改后完整代码
from selenium import webdriver from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By import numpy as np import pandas as pd browser = webdriver.Chrome() # 最长等待10秒,轮询检查元素是否存在 wait = WebDriverWait(browser, 10) # Product1 browser.get('https://www.amazon.com.tr/Behringer-High-Precision-Crossover-Limiters-Adjustable/dp/B07GSGYRK1/ref=sr_1_1?dchild=1&keywords=behringer+cx3400+v2&qid=1630311885&sr=8-1') price_text = "N/A" try: # 先等待元素加载完成,再取元素 price_ele = wait.until(EC.presence_of_element_located((By.ID, 'priceblock_ourprice'))) price_text = price_ele.text except NoSuchElementException: # 捕获元素不存在的异常,保持price_text为默认值即可 pass df = pd.DataFrame([["info", "info", price_text]], columns=["Product", "Firm", "Price"]) df.to_csv('info.csv', encoding="utf-8", index=False, header=False) df_final = pd.read_csv('info.csv') df_final.head() browser.quit()
逻辑说明
- 如果元素正常加载完成,就取元素的text作为价格值
- 如果等待超时后仍找不到元素,就会捕获到
NoSuchElementException,价格用预设的N/A填充,程序会继续执行后面的CSV写入等逻辑,不会中断 - 如果后续要爬取多个商品,只需要把商品访问、价格抓取的逻辑放到循环里即可,单个商品抓不到价格不会影响整个循环运行
内容的提问来源于stack exchange,提问作者Alex Kurkcu
相关产品推荐
相关产品推荐

