Selenium Python中NoSuchElementException错误排查求助
解决Selenium爬取ESARJ站点信息的NoSuchElementException问题
问题原因分析
- 绝对XPATH过于脆弱:你使用的绝对路径完全依赖页面DOM层级结构,只要页面有微小变动(比如新增元素、样式调整),路径就会直接失效。
- 未处理页面加载延迟:页面还没完全渲染完成就执行元素查找,导致目标元素尚未出现在DOM中。
- 代码存在语法与逻辑错误:
StationModel的XPATH里有拼写错误(d iv多了空格);未导入pandas模块;列表未实际填充数据;find_element/find_elements混用导致逻辑混乱。
修正方案
1. 使用稳定的相对XPATH定位
基于元素的文本、属性编写相对路径,避免依赖DOM层级:
- 站点名称:定位包含"İstasyon Adı"的表格行,提取对应值
- 地址:定位包含"Adres"的表格行,提取对应值
- 站点模型:定位包含"İstasyon Modeli"的表格行,提取对应值
- 插座类型:定位包含"Prizi Tipi"的表格行,提取对应值
2. 添加显式等待
等待目标元素加载完成后再执行查找,避免因页面渲染延迟导致的错误。
3. 修正代码语法与逻辑
- 导入缺失的
pandas模块 - 修复XPATH拼写错误
- 正确填充数据到列表
- 统一元素查找逻辑
修正后的完整代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import pandas as pd # 基于文本定位的相对XPATH,稳定性更高 NAME_XPATH = "//table[.//td[text()='İstasyon Adı']]/tbody/tr/td[2]/span" ADDRESS_XPATH = "//table[.//td[text()='Adres']]/tbody/tr/td[2]" STATION_MODEL_XPATH = "//table[.//td[text()='İstasyon Modeli']]/tbody/tr/td[2]" SOCKET_TYPE_XPATH = "//table[.//td[text()='Prizi Tipi']]/tbody/tr/td[2]" path_chrome = r'C:\Users\efede\OneDrive\Masaüstü\F\exeler\chromedriver.exe' driver = webdriver.Chrome(path_chrome) NameList = [] AddressList = [] StationModelList = [] SocketTypeList = [] try: driver.get('https://esarj.com/harita?s=TR-BOL-001') # 显式等待,最长等待10秒直到元素加载完成 wait = WebDriverWait(driver, 10) # 提取各字段数据并添加到列表 name = wait.until(EC.presence_of_element_located((By.XPATH, NAME_XPATH))).text NameList.append(name) address = wait.until(EC.presence_of_element_located((By.XPATH, ADDRESS_XPATH))).text AddressList.append(address) station_model = wait.until(EC.presence_of_element_located((By.XPATH, STATION_MODEL_XPATH))).text StationModelList.append(station_model) socket_type = wait.until(EC.presence_of_element_located((By.XPATH, SOCKET_TYPE_XPATH))).text SocketTypeList.append(socket_type) finally: # 确保浏览器关闭 driver.quit() # 生成DataFrame并保存到Excel zip_df = pd.DataFrame({ "İstasyonAdı": NameList, "Adres": AddressList, "İstasyonModeli": StationModelList, "PriziTipi": SocketTypeList }) zip_df.to_excel("ESARJ.xlsx", sheet_name="ESARJ(12.6.23)", index=False) print(zip_df)
额外说明
- 如果需要爬取多个站点,需先遍历地图上的所有站点标记,点击后重复执行数据提取逻辑。
- 相对XPATH的稳定性远高于绝对路径,建议始终优先使用。
- 显式等待比隐式等待更灵活,可针对特定元素设置精准的等待条件。
内容的提问来源于stack exchange,提问作者Efe Değirmenci
相关产品推荐
相关产品推荐

