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

Selenium(Python):获取网页可选择窗口及解析href链接失败求助

解决Selenium获取窗口句柄与ArcGIS数据集链接的问题

嘿,我来帮你搞定这两个问题!先分别拆解来看:

一、获取所有可选择的窗口(窗口句柄)

在Selenium里,要获取当前浏览器所有打开的窗口,用window_handles方法就能拿到所有窗口的句柄,还能切换到任意窗口操作。示例代码如下:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# 初始化Chrome无头浏览器(比PhantomJS靠谱多了)
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
driver = webdriver.Chrome(options=chrome_options)

driver.get("https://data-wake.opendata.arcgis.com/datasets")

# 获取所有窗口句柄
all_windows = driver.window_handles
print("当前所有窗口句柄:")
for handle in all_windows:
    # 切换到对应窗口
    driver.switch_to.window(handle)
    print(f"句柄:{handle},窗口标题:{driver.title}")

二、修复ArcGIS数据集链接无法获取的问题

你原代码拿不到链接,主要踩了两个坑:

  1. PhantomJS已经彻底过时:这个工具早就停止维护了,对现代动态渲染的页面兼容性极差,很多AJAX加载的内容根本抓不到。
  2. 没等页面动态加载完成:ArcGIS的数据集页面是滚动加载的,直接拿page_source只能抓到初始的静态HTML,后续加载的数据集链接根本不在里面。

改进后的代码方案

用Chrome无头模式替代PhantomJS,再加上等待元素加载的逻辑,确保页面内容完全渲染后再解析:

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

# 配置Chrome无头模式
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
driver = webdriver.Chrome(options=chrome_options)

try:
    driver.get("https://data-wake.opendata.arcgis.com/datasets")
    
    # 等待数据集链接加载完成(最多等10秒)
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, "a.dataset-link"))
    )
    
    # 方法1:用BeautifulSoup解析页面源码
    page_source = driver.page_source
    bsobj = BeautifulSoup(page_source, 'lxml')
    
    print("\n所有有效href链接:")
    for a_tag in bsobj.find_all('a', href=True):
        href = a_tag.get('href')
        # 把相对路径转成完整URL
        if href.startswith('/'):
            href = f"https://data-wake.opendata.arcgis.com{href}"
        print(href)
    
    # 方法2:直接用Selenium获取元素(更简单,不需要BeautifulSoup)
    # print("\n直接用Selenium获取的链接:")
    # all_links = driver.find_elements(By.TAG_NAME, 'a')
    # for link in all_links:
    #     href = link.get_attribute('href')
    #     if href:
    #         print(href)
finally:
    # 记得关闭浏览器
    driver.quit()

关键说明

  • 用WebDriverWait等待特定元素出现,确保页面动态内容加载完成再抓取。
  • 把相对路径的href拼接成完整URL,避免拿到无效的短路径。
  • 推荐用Chrome无头模式,稳定性和兼容性甩PhantomJS几条街。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:49:21