You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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带有oraloadoraInitDisplayStyle属性,第二个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

火山引擎 最新活动