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

Python Selenium可定位特色链接但无法找到可见常规元素求助

解决Selenium无法定位常规链接的问题

可能的原因及对应解决方案

1. 定位语法过时

你使用的find_elements_by_xpath是Selenium旧版API,目前已被弃用,需替换为新版定位方式:
首先导入By模块:

from selenium.webdriver.common.by import By

然后修改代码中的定位语句:

articles = driver.find_elements(By.XPATH, '//div[@class="entryNorm"]')
# 以及子元素定位
title = article.find_element(By.XPATH, './/a[@class="entryNorm9"]').text

2. 固定等待无法覆盖动态加载

time.sleep(5)是固定时长等待,稳定性差,建议换成显式等待,确保目标元素加载完成后再执行定位:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 替换原有的time.sleep(5)
WebDriverWait(driver, 10).until(
    EC.presence_of_all_elements_located((By.XPATH, '//div[@class="entryNorm"]'))
)

该代码会等待最多10秒,直到目标元素出现后再继续执行。

3. 元素处于iframe/frame中

如果常规链接所在的entryNorm元素嵌套在iframe里,必须先切换到对应iframe才能定位:

# 根据页面实际的iframe属性(id/name/xpath)定位
iframe = driver.find_element(By.XPATH, '//iframe[@id="目标iframe的ID"]')
driver.switch_to.frame(iframe)
# 之后再定位articles元素
articles = driver.find_elements(By.XPATH, '//div[@class="entryNorm"]')
# 操作完成后切回主文档
driver.switch_to.default_content()

4. 定位表达式不准确

手动验证xpath是否正确:

  • 打开目标网页按F12进入开发者工具
  • 在控制台输入$x('//div[@class="entryNorm"]'),查看是否返回目标元素
  • 如果返回为空,检查class名称是否有空格、拼写错误,或页面结构是否有嵌套变化
  • 同理验证.//a[@class="entryNorm9"]是否能定位到链接

5. 页面需滚动触发元素加载

部分页面需要滚动到元素可见区域才会加载内容,可尝试滚动页面:

# 滚动到页面底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# 等待加载完成
time.sleep(2)
# 再定位元素
articles = driver.find_elements(By.XPATH, '//div[@class="entryNorm"]')

6. 网站反爬检测

如果以上方法都无效,可能是网站检测到Selenium的自动化特征,可尝试隐藏自动化标识:

from selenium.webdriver.chrome.options import Options

options = Options()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
options.add_argument('--disable-blink-features=AutomationControlled')
driver = webdriver.Chrome(options=options)

调整后的完整示例代码

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
from selenium.webdriver.chrome.options import Options
import time

options = Options()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
options.add_argument('--disable-blink-features=AutomationControlled')

driver = webdriver.Chrome(options=options)

for page in range(1,5):
    try:
        url = "https://www.jasminedirectory.com/business-marketing/page,{}.html".format(page)
        driver.get(url)
        print(driver.current_url)
        
        # 显式等待元素加载
        WebDriverWait(driver, 10).until(
            EC.presence_of_all_elements_located((By.XPATH, '//div[@class="entryNorm"]'))
        )
        
        # 滚动页面确保元素完全加载
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(2)
        
        articles = driver.find_elements(By.XPATH, '//div[@class="entryNorm"]')
        data = []
        for article in articles:
            try:
                title = article.find_element(By.XPATH, './/a[@class="entryNorm9"]').text
                data.append(title)
                print(title)
            except Exception as e:
                print(f"获取标题失败: {e}")
                continue
    except Exception as e:
        print(f"页面加载失败: {e}")
        continue

driver.quit()

内容的提问来源于stack exchange,提问作者natalie22

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 20:35:16