使用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
相关产品推荐
相关产品推荐

