使用VBA抓取HTML嵌套类内容的技术求助
VBA IE9 抓取航班舱位及座位可用性数据解决方案
核心实现思路
针对无唯一ID、类名动态变化的问题,通过CSS选择器定位父容器,再在每个父容器内精准查找子元素,完全适配IE9环境:
- 用
querySelectorAll匹配所有包含flightCabin3和cabin-block类的父元素(忽略中间动态变化的colmn[i]/flightCabinOption_[j]类名) - 遍历每个父容器,分别提取:
- 舱位类型:子元素
.travel-class的文本内容 - 座位状态:优先查找
.noAvlbl(标记无可用),若不存在则取.message-number-of-seats的座位数文本
- 舱位类型:子元素
完整VBA代码示例
Sub 抓取航班舱位数据() Dim ie As Object Dim parentElements As Object Dim parentElem As Object Dim travelClassElem As Object Dim seatStatusElem As Object Dim rowNum As Integer ' 初始化IE对象 Set ie = CreateObject("InternetExplorer.Application") ie.Visible = True ' 调试时可设为True,发布后改为False ' 打开目标页面(替换为你的目标URL) ie.Navigate "你的目标网页URL" ' 等待页面加载完成(IE9兼容版) Do While ie.Busy Or ie.ReadyState <> 4 DoEvents Loop ' 定位所有符合条件的父容器 Set parentElements = ie.Document.querySelectorAll(".flightCabin3.cabin-block") ' 初始化输出行号 rowNum = 1 ' 遍历每个父容器 For Each parentElem In parentElements ' 提取舱位类型 Set travelClassElem = parentElem.querySelector(".travel-class") If Not travelClassElem Is Nothing Then Cells(rowNum, 1).Value = travelClassElem.innerText Else Cells(rowNum, 1).Value = "未找到舱位类型" End If ' 提取座位可用性 Set seatStatusElem = parentElem.querySelector(".noAvlbl") If Not seatStatusElem Is Nothing Then Cells(rowNum, 2).Value = "无可用座位" Else Set seatStatusElem = parentElem.querySelector(".message-number-of-seats") If Not seatStatusElem Is Nothing Then Cells(rowNum, 2).Value = seatStatusElem.innerText Else Cells(rowNum, 2).Value = "状态未知" End If End If rowNum = rowNum + 1 Next parentElem ' 关闭IE并释放资源 ie.Quit Set ie = Nothing Set parentElements = Nothing Set parentElem = Nothing MsgBox "数据抓取完成!" End Sub
关键步骤解释
CSS选择器说明:
.flightCabin3.cabin-block:匹配同时拥有flightCabin3和cabin-block类的元素,自动忽略动态变化的中间类名,完美适配目标HTML结构- 子元素选择器
.travel-class/.noAvlbl/.message-number-of-seats:在当前父容器内查找,确保舱位和状态一一对应
IE9兼容性处理:
- 使用
querySelectorAll和querySelector:IE9完全支持这两个方法,比getElementsByClassName更稳定,也避开了你遇到的getElementsByTagName问题 - 页面等待逻辑:标准的
Busy+ReadyState判断,确保页面加载完成后再抓取数据
- 使用
容错处理:
- 每个元素查找后都添加
Is Nothing判断,避免因页面结构异常导致代码崩溃 - 异常情况标记为“未找到舱位类型”或“状态未知”,方便后续排查
- 每个元素查找后都添加
内容的提问来源于stack exchange,提问作者Hennebou
相关产品推荐
相关产品推荐

