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数据集链接无法获取的问题
你原代码拿不到链接,主要踩了两个坑:
- PhantomJS已经彻底过时:这个工具早就停止维护了,对现代动态渲染的页面兼容性极差,很多AJAX加载的内容根本抓不到。
- 没等页面动态加载完成: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
相关产品推荐
相关产品推荐

