使用VBA提取IE指定span文本遇重复属性元素,如何精准提取目标值?
VBA IE提取指定span文本时获取旧值的解决方案
你的问题核心在于:页面中存在两个带有orafield="MSerialNumber"属性的<span>元素,而你的代码找到第一个匹配项后就执行Exit For跳出循环了,所以只会拿到第一个元素的文本G4A001,而非你需要的第二个元素E5W807。下面提供两种针对性的解决方法:
方法一:收集所有匹配元素,取最后一个
这种方法适合你明确需要页面中最后一个符合条件的元素的场景,逻辑简单直接:
Dim matchingSpans As New Collection Set objSubCollec = objCollection(0).contentWindow.document.getElementById("Page") Set objElement = objSubCollec.contentWindow.document.getElementById("Frame_4") objElement.Focus Set objElement1 = objElement.contentWindow.document Set elm2 = objElement1.getElementsByTagName("span") ' 遍历所有span,把符合条件的存入集合 For Each e1 In elm2 If e1.getAttribute("orafield") = "MSerialNumber" Then matchingSpans.Add e1 End If Next ' 如果有匹配元素,取最后一个的innerText If matchingSpans.Count > 0 Then temp = matchingSpans(matchingSpans.Count).innerText Worksheets("Sheet1").Range("B6") = temp ' MsgBox temp Else MsgBox "未找到匹配的Serial Number元素" End If
方法二:通过父容器特征精准定位目标元素
观察你的两段HTML可以发现,两个<span>的父级<div>有明显区别:第一个div带有oraload和oraInitDisplayStyle属性,第二个div没有这些属性。我们可以利用这个特征来精准定位你需要的第二个元素:
Set objSubCollec = objCollection(0).contentWindow.document.getElementById("Page") Set objElement = objSubCollec.contentWindow.document.getElementById("Frame_4") objElement.Focus Set objElement1 = objElement.contentWindow.document Set elm2 = objElement1.getElementsByTagName("span") For Each e1 In elm2 ' 同时检查span的orafield属性,以及父div是否没有oraload属性 If e1.getAttribute("orafield") = "MSerialNumber" Then ' 父元素不存在oraload属性时,就是我们要找的目标 If e1.ParentNode.getAttribute("oraload") = "" Then temp = e1.innerText Worksheets("Sheet1").Range("B6") = temp ' MsgBox temp Exit For End If End If Next
两种方法对比:方法一通用性强,不管页面中匹配元素的位置如何,都能拿到最后一个;方法二更精准,依赖页面结构的特征,能避免后续页面新增同类元素时取错值的问题,你可以根据实际场景选择使用。
内容的提问来源于stack exchange,提问作者Job Seeker




