You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 12:37:16