You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用getElementsByClassName设置变量时出现VBA网页抓取错误

解决VBA抓取网页时的运行时错误'91'

这个错误我之前也碰到过,本质是你在尝试访问一个不存在的对象——咱们一步步来拆解问题和解决办法:

错误原因

运行时错误'91'触发的直接原因是:oHtml.getElementsByClassName("resolutionWidget-state-list")(0)这部分代码里,getElementsByClassName返回的元素集合是空的,没有找到任何匹配的元素,所以你用(0)去取第一个元素时,就会因为“对象未设置”而报错。

解决步骤&修正后的代码

首先,我们需要在代码里加入存在性检查,避免直接访问不存在的元素;其次,还要考虑网页内容是否是动态生成的情况。这里给你修改后的代码:

Private Sub Scrape_schedule()
    Dim oHtml As HTMLDocument
    Dim stateList As Object
    Dim dados As Object
    
    Set oHtml = New HTMLDocument
    
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "https://example.com", False
        .Send
        oHtml.body.innerHTML = .responseText
    End With
    
    ' 先尝试获取目标父元素集合
    Set stateList = oHtml.getElementsByClassName("resolutionWidget-state-list")
    
    ' 检查是否找到父元素
    If stateList.Length > 0 Then
        ' 再获取子元素li
        Set dados = stateList(0).getElementsByTagName("li")
        
        ' 可选:如果需要处理获取到的li元素,可以在这里遍历
        If dados.Length > 0 Then
            Dim listItem As Object
            For Each listItem In dados
                Debug.Print listItem.innerText ' 输出到立即窗口查看内容
            Next listItem
        Else
            MsgBox "没有找到目标li元素"
        End If
    Else
        MsgBox "未找到类名为'resolutionWidget-state-list'的元素"
    End If
End Sub

额外需要排查的点

如果加了检查后还是提示找不到元素,那大概率是网页内容是动态加载的:

  • 你用MsgBox看到的HTML是浏览器渲染后的结果,但MSXML2.XMLHTTP只会获取网页的初始静态HTML,那些通过JavaScript动态生成的元素(比如AJAX加载、Vue/React渲染的内容)是拿不到的。
  • 这种情况下,你需要改用InternetExplorer.Application来模拟浏览器加载页面(等待JS执行完成后再抓取),或者使用Selenium这类自动化工具。

内容的提问来源于stack exchange,提问作者user1088793

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:21:19