基于Selenium模块实现切换句柄
前言
有些网站页面在点开链接后会出现新的窗口,但是浏览器对象 browser(driver) 还是之前页面的对象,针对此问题,需要切换到不同的窗口进行操作,Selenium 模块提供了 switch_to.window() 方法 切换句柄 和 window_handles 属性 获取句柄列表,下面详细介绍如何使用 Selenium 模块完成句柄的切换,并以实际案例进行展示。
正文
1、常用方法
- 获取当前窗口句柄:
browser.current_window_handle - 获取所有句柄:
browser.window_handles - 切换句柄:
browser.switch_to.window()
2、使用流程
- 先创建浏览器对象:
browser = webdriver.Chrome() - 先获取当前所有句柄(列表):
all_handles = browser.window_handles - 再切换到指定句柄(利用列表下标索引取值):
browser.switch_to.window(all_handles[1])
3、使用示例
3.1、梳理需求

使用 selenium 抓取民政部最新行政区划代码,由于点击链接后,会出现界面的跳转,所以需要通过 selenium 实现句柄的切换
3.2、程序源码
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
class MZBSpider:
def __init__(self):
self.options = webdriver.ChromeOptions() # 创建options功能对象
self.options.add_argument('--headless') # 设置无界面模式
self.driver = webdriver.Chrome(options=self.options) # 创建浏览器对象
self.driver.get(url='https://www.mca.gov.cn/article/sj/xzqh/2020/') # 输入网址
def parse_html(self):
"""
function: html解析函数
in: None
out: None
return: None
others: HTML Parse Func
"""
new_month_a = self.driver.find_element(By.XPATH,
'//*[@id="list_content"]/div[2]/div/ul/table/tbody/tr[1]/td[2]/a') # 找到最新月份的a节点
time.sleep(1) # 给页面的加载预留时间
new_month_a.click() # 点击
li = self.driver.window_handles # 出现两个窗口,需要切换句柄,先获取句柄列表
self.driver.switch_to.window(li[1]) # 切换句柄
tr_list = self.driver.find_elements(By.XPATH, '//*[@id="2020年10月份县以上行政区划代码_32423"]/table/tbody/tr')
item = {}
try:
for tr in tr_list[3:]:
one_city_list = tr.text.split()
item["城市"] = one_city_list[1].strip()
item["行政代码"] = one_city_list[0].strip()
print(item) # 打印
except Exception as e:
self.driver.quit() # 出现异常退出
def run(self):
"""
function: 程序入口函数
in: None
out: None
return: None
others: Program Entry Func
"""
self.parse_html()
if __name__ == '__main__':
spider = MZBSpider()
spider.run()
其中:
li = self.driver.window_handles # 出现两个窗口,需要切换句柄,先获取句柄列表
self.driver.switch_to.window(li[1]) # 切换句柄
这两句是实现句柄切换的具体步骤

文章介绍了如何使用Selenium模块处理网页窗口切换的问题,特别是在点击链接导致新窗口出现时。通过`window_handles`属性获取句柄列表,并用`switch_to.window()`方法切换到目标窗口。文中提供了一个具体的示例,展示了在抓取民政部最新行政区划代码时,如何进行句柄切换来正确处理页面跳转。
】基于Selenium模块实现切换句柄&spm=1001.2101.3001.5002&articleId=129996101&d=1&t=3&u=97bd19a7235e4318ac603d527ffa80f7)
634

被折叠的 条评论
为什么被折叠?



