VBA数据爬取:如何在HTML元素集合中筛选指定元素?
用VBA筛选元素集合中的特定数据
当然可以通过For Each结合条件判断来筛选你需要的元素!你的HTML结构很清晰,每个数据行都包含一个带.label类的标签和对应的.value标签,刚好可以利用这一点精准提取你要的信息。
我帮你修改了代码,加入了条件筛选逻辑,直接看修改后的版本:
Sub Refresh() Dim XMLPage As New MSXML2.XMLHTTP60 Dim HTMLDoc As New MSHTML.HTMLDocument Dim HTMLRows As MSHTML.IHTMLElementCollection ' 改成存储行元素更准确 Dim HTMLRow As MSHTML.IHTMLElement Dim labelElem As MSHTML.IHTMLElement Dim valueElem As MSHTML.IHTMLElement ' 发送请求获取页面内容 XMLPage.Open "GET", Mapping.Range("B2"), False XMLPage.send HTMLDoc.body.innerHTML = XMLPage.responseText ' 定位到stockinfocol1容器下的所有行div ' 注意加(0)是因为getElementsByClassName返回集合,我们取第一个(也是唯一的)容器 Set HTMLRows = HTMLDoc.getElementsByClassName("stockinfocol1")(0).getElementsByTagName("div") ' 遍历每一行 For Each HTMLRow In HTMLRows ' 用querySelector快速定位当前行的label和value元素 Set labelElem = HTMLRow.querySelector(".label") Set valueElem = HTMLRow.querySelector(".value") ' 确保两个元素都存在再进行判断 If Not labelElem Is Nothing And Not valueElem Is Nothing Then ' 用Trim去掉label文本的多余空格,避免匹配失败 Select Case Trim(labelElem.innerText) Case "Last Traded Share Price" Debug.Print "Last Traded Share Price: " & valueElem.innerText ' 要是想把值写入单元格,比如写到C2: ' Mapping.Range("C2").Value = valueElem.innerText Case "Volume Traded" Debug.Print "Volume Traded: " & valueElem.innerText ' 写入C3的话: ' Mapping.Range("C3").Value = valueElem.innerText End Select End If Next HTMLRow End Sub
关键修改说明:
- 把原来的
HTMLTable改成HTMLRows,因为我们实际遍历的是每个数据行,命名更准确 - 用
getElementsByClassName("stockinfocol1")(0)获取唯一的容器,再取它下面的所有行div,避免遍历到无关元素 - 使用
querySelector来快速定位每行的label和value,比嵌套遍历更简洁高效 - 用
Trim(labelElem.innerText)处理标签文本,防止因为末尾空格导致匹配失败 - 用
Select Case替代多个If,以后要添加其他需要筛选的元素(比如Day Range),直接加Case就行,代码更易维护
运行这段代码后,Debug窗口只会输出你需要的两个数据,完美解决你的需求!
内容的提问来源于stack exchange,提问作者Conor Chua
相关产品推荐
相关产品推荐

