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

如何在Python/Selenium中从无<a>标签及onclick事件的特定类名div元素提取跳转URL

嘿,我来帮你梳理下这个问题!你碰到的情况在现代网站里挺常见的——很多站点会用纯JavaScript逻辑来处理页面跳转,完全不依赖传统的<a>标签或者onclick属性,这确实会给抓取跳转URL带来点小麻烦。先看看你的代码里几个明显的小问题,再给你几个可行的解决思路:

先修正代码里的基础错误

你代码里的print(driver.page)是无效的,应该改成print(driver.page_source)来打印页面源码;另外你用的类名sc-452fc789-2 eIXiYR看起来像是前端框架自动生成的动态类名,这类类名很容易在网站更新后失效,建议换成更稳定的定位方式(比如结合元素的文本内容、其他固定属性的XPath)。

解决跳转URL提取的几种方法

1. 检查元素的自定义属性

很多网站会把跳转目标URL藏在元素的data-*自定义属性里(比如data-url、data-href),你可以先查看这个div元素的HTML结构,然后用Selenium的get_attribute方法直接提取:

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def SCHLproject(query):
    chrome_options = Options()
    chrome_options.add_argument("--headless")
    chrome_options.add_argument("--disable-gpu")
    driver = webdriver.Chrome(options=chrome_options)

    url = f"https://www.truemeds.in/search/{str(query)}"
    driver.get(url)
    
    # 用更稳定的定位方式,比如结合元素文本或其他属性,这里示例用XPath(你需要根据实际页面调整)
    wait = WebDriverWait(driver, 10)
    ele = wait.until(EC.presence_of_element_located((By.XPATH, "//div[contains(@class, 'sc-452fc789-2')]")))
    
    # 提取自定义属性里的URL,比如data-href,需要根据实际页面的属性名调整
    target_url = ele.get_attribute("data-href")
    if target_url:
        print("提取到的跳转URL:", target_url)
        # 如果需要跳转,直接访问这个URL即可
        driver.get(target_url)
        print("跳转后的当前URL:", driver.current_url)
    else:
        # 如果没有自定义属性,再尝试点击并等待跳转
        ele.click()
        wait.until(EC.url_changes(url))
        print("跳转后的当前URL:", driver.current_url)
    
    driver.quit()
    
SCHLproject("naxdom")

2. 监听网络请求捕获跳转

如果跳转是通过AJAX请求或者JS动态触发的页面跳转,你可以监听浏览器的网络请求,捕获跳转的目标URL。可以用selenium-wire这个扩展库来实现(需要先安装:pip install selenium-wire):

from seleniumwire import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def SCHLproject(query):
    chrome_options = Options()
    chrome_options.add_argument("--headless")
    chrome_options.add_argument("--disable-gpu")
    driver = webdriver.Chrome(options=chrome_options)

    url = f"https://www.truemeds.in/search/{str(query)}"
    driver.get(url)
    
    wait = WebDriverWait(driver, 10)
    ele = wait.until(EC.element_to_be_clickable((By.XPATH, "//div[contains(@class, 'sc-452fc789-2')]")))
    
    # 清空之前的请求记录
    del driver.requests
    
    ele.click()
    
    # 遍历请求,找到跳转的目标URL
    for request in driver.requests:
        if request.response and request.status_code == 200:
            # 根据实际跳转的URL特征筛选,比如包含药品详情的路径
            if "/product/" in request.url:
                print("捕获到的跳转URL:", request.url)
                break
    
    driver.quit()
    
SCHLproject("naxdom")

3. 等待页面跳转完成后获取当前URL

如果不需要提前提取URL,只是想拿到跳转后的地址,可以等待URL发生变化后再获取current_url,这也是你原本代码的思路,但需要加上等待逻辑,避免页面还没跳转就打印URL:

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def SCHLproject(query):
    chrome_options = Options()
    chrome_options.add_argument("--headless")
    chrome_options.add_argument("--disable-gpu")
    driver = webdriver.Chrome(options=chrome_options)

    url = f"https://www.truemeds.in/search/{str(query)}"
    driver.get(url)
    
    wait = WebDriverWait(driver, 10)
    ele = wait.until(EC.element_to_be_clickable((By.XPATH, "//div[contains(@class, 'sc-452fc789-2')]")))
    ele.click()
    
    # 等待URL变化,确保跳转完成
    wait.until(EC.url_changes(url))
    print("跳转后的当前URL:", driver.current_url)
    
    driver.quit()
    
SCHLproject("naxdom")

小提示

  • 动态生成的类名(比如sc-452fc789-2)尽量不要单独用来定位元素,建议结合元素的文本、父元素属性等生成更稳定的XPath或CSS选择器。
  • 无头模式下可能会有一些JS渲染问题,如果遇到元素定位失败,可以先关闭无头模式调试页面,确认元素的真实结构。

备注:内容来源于stack exchange,提问作者Mahim Tiwari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 12:38:08