VBA,搜索文本字符串的HTML元素ID

VBA,搜索文本字符串的HTML元素ID,html,vba,excel,Html,Vba,Excel,在web数据收集过程中,我有以下几行代码: IE.document.GetElementById("ct175_tocAccept").Click 问题是,该公司经常以不一致的时间间隔更新其网站,并且每次都更改上述ct。就我个人而言,我不介意经常更新,但实际上这不是一个选项,因为我的同事经常需要立即获得这些结果,并且无法自己解决问题 有没有一种方法可以让我在该站点上搜索所有ElementID,找到文本“toAccept”,然后单击该结果?该项目没有可供我选择的名称。非常感谢所有建议和解决方案

在web数据收集过程中,我有以下几行代码:

IE.document.GetElementById("ct175_tocAccept").Click
问题是,该公司经常以不一致的时间间隔更新其网站,并且每次都更改上述ct。就我个人而言,我不介意经常更新,但实际上这不是一个选项,因为我的同事经常需要立即获得这些结果,并且无法自己解决问题

有没有一种方法可以让我在该站点上搜索所有ElementID,找到文本“toAccept”,然后单击该结果?该项目没有可供我选择的名称。非常感谢所有建议和解决方案

编辑: 资料来源:


是的,我已阅读、理解并同意这些条款和条件

我遇到的主要问题是,页面上几乎每个elementid和名称都使用ct175(现在更新为ct176)部分。另外,为了澄清,我在原始帖子中说元素没有名称。我提供的源代码确实有一个名称,但我需要处理的其他多个源代码都没有名称。

显然,如果没有我面前的站点,就无法测试这一点,但您有两个对象可以迭代,然后单击满足所有条件的对象,这似乎是:

  • 父类的复选框为
    checkbox
  • 标记名为
    label
代码:

Option Explicit

Sub TEST()

    ' Code Above

    Dim objCheckbox As Object, objCheckboxes As Object
    Dim objLabel As Object, objLabels As Object
    Set objCheckboxes = ie.document.getElementsByClassName("checkbox")

    For Each objCheckbox In objCheckboxes
        Set objLabels = Nothing
        On Error Resume Next
        Set objLabels = objCheckbox.getElementsByTagName("label")
        On Error GoTo 0
        For Each objLabel In objLabels
            If objLabel.innerText Like "*Yes, I have read, understand and agree*" Then
                objLabel.Click
                Exit For
            End If
        Next objLabel
    Next objCheckbox

End Sub

另一种方法可能是找到保持不变的父节点,然后单击第n个子节点。我不使用VBA进行任何web抓取,也不推荐使用VBA,因此这种方法实际上可能不可行。这绝对值得一试,谢谢你的想法。这是可能的,但这令人头痛。Xpath将在它们之间添加任何sybling时更改@詹姆斯:试试使用通配符。你能提供元素及其父节点的源代码吗?网站是什么?您可以匹配
.href
.innerText
这对我来说很有效。谢谢你的建议(也谢谢其他人的建议)。
Option Explicit

Sub TEST()

    ' Code Above

    Dim objCheckbox As Object, objCheckboxes As Object
    Dim objLabel As Object, objLabels As Object
    Set objCheckboxes = ie.document.getElementsByClassName("checkbox")

    For Each objCheckbox In objCheckboxes
        Set objLabels = Nothing
        On Error Resume Next
        Set objLabels = objCheckbox.getElementsByTagName("label")
        On Error GoTo 0
        For Each objLabel In objLabels
            If objLabel.innerText Like "*Yes, I have read, understand and agree*" Then
                objLabel.Click
                Exit For
            End If
        Next objLabel
    Next objCheckbox

End Sub