如何用Selenium Python获取无href锚点标签的隐藏跳转URL?
如何获取无href属性锚点标签的隐藏跳转URL?
环境:Python 3.9.12,Selenium 4.8.0
目标页面:迪士尼加拿大餐厅页面,点击「Search Times」后显示的餐厅列表中,预订按钮的<a>标签无href属性,需要获取其跳转URL。
方法1:查找Angular路由属性(优先尝试)
迪士尼页面基于Angular框架,这类无href的跳转通常会用routerLink自定义属性定义路由路径,直接获取该属性后拼接基础URL即可:
for card in cards: # 定位时间按钮的a标签 time_button = card.find_element(By.CLASS_NAME, 'offer') # 获取routerLink属性值 router_link = time_button.get_attribute('routerLink') if router_link: # 拼接完整跳转URL full_url = f"https://disneyland.disney.go.com{router_link}" print(f"预订跳转URL:{full_url}")
方法2:提取点击事件中的URL逻辑
如果没有routerLink属性,可以通过JavaScript获取按钮绑定的点击事件代码,从中提取跳转URL:
import re for card in cards: time_button = card.find_element(By.CLASS_NAME, 'offer') # 执行JS获取元素的点击事件监听代码 click_event_codes = driver.execute_script(""" const elem = arguments[0]; const listeners = getEventListeners(elem); return listeners.click ? listeners.click.map(l => l.listener.toString()) : []; """, time_button) # 从事件代码中匹配URL for code in click_event_codes: url_match = re.search(r'https?://[^"\']+|/[^"\']+', code) if url_match: raw_url = url_match.group() # 补全相对URL的基础域名 full_url = f"https://disneyland.disney.go.com{raw_url}" if raw_url.startswith('/') else raw_url print(f"提取到的跳转URL:{full_url}")
方法3:监听网络请求捕获跳转URL
如果前两种方法无效,可通过Selenium的DevTools API监听点击按钮时触发的网络请求,直接捕获跳转目标:
# 启用网络监听 driver.execute_cdp_cmd('Network.enable', {}) # 定义请求回调函数,筛选预订/登录相关URL def capture_redirect_url(request): request_url = request['request']['url'] if '/reservation' in request_url or '/login' in request_url: print(f"捕获跳转URL:{request_url}") # 注册请求监听 driver.add_cdp_listener('Network.requestWillBeSent', capture_redirect_url) # 遍历卡片点击按钮触发请求 for card in cards: time_button = card.find_element(By.CLASS_NAME, 'offer') time_button.click() # 点击后返回上一页,继续处理下一个卡片 driver.back() # 关闭网络监听 driver.execute_cdp_cmd('Network.disable', {})
注意事项
- 页面加载可能存在延迟,建议在点击「Search Times」后添加显式等待(
WebDriverWait),确保卡片完全加载后再操作。 - Angular页面的元素属性可能随版本变化,若
routerLink不存在,可以检查其他自定义属性(如data-url、data-link等)。
内容的提问来源于stack exchange,提问作者Muhammad Daniyal
相关产品推荐
相关产品推荐

