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

VBA网页抓取DIV类字段时出现运行时错误91该如何解决?

错误原因排查与修复方案

错误根因

运行时错误91的核心触发原因是getElementsByClassName没有匹配到对应类名的DOM元素,调用(0).innerText时对空对象执行操作触发报错。你当前抓取的站点有两个特性导致原代码失效:

  • 页面业务数据为异步加载,直接用XMLHTTP请求拿到的初始HTML中不存在service_manager、service_tel类对应的内容
  • 站点自带反爬校验,直接发送XMLHTTP请求会被拦截,返回的不是正常业务页面内容

修复代码

建议改用IE自动化对象加载页面,等待异步渲染完成后再提取数据,可直接运行的修正代码如下,你之前添加的MS HTML和XML v6.0引用保留即可:

Sub WebData()
  Dim ie As Object
  Dim html As HTMLDocument
  Dim currentRow As Long
  Dim serviceManager As Object, serviceTel As Object
  
  currentRow = 1 ' 此处替换为你实际的起始行号
  
  ' 初始化IE对象
  Set ie = CreateObject("InternetExplorer.Application")
  ie.Visible = False ' 调试时可设为True,直观查看页面加载状态
  
  ' 加载目标页面
  ie.navigate "https://www.careinspectorate.com/index.php/care-services?detail=CS2004081195"
  ' 等待页面基础加载完成
  Do While ie.Busy Or ie.readyState <> 4
    DoEvents
  Loop
  ' 额外等待1秒,保证异步接口返回的数据渲染完成
  Application.Wait Now + TimeValue("00:00:01")
  
  Set html = ie.document
  
  ' 先判断元素是否存在,避免空对象报错
  Set serviceManager = html.getElementsByClassName("service_manager")
  If Not serviceManager Is Nothing And serviceManager.Length > 0 Then
    Cells(currentRow, 1) = Trim(serviceManager(0).innerText)
  Else
    Cells(currentRow, 1) = "未获取到负责人信息"
  End If
  
  currentRow = currentRow + 1
  
  Set serviceTel = html.getElementsByClassName("service_tel")
  If Not serviceTel Is Nothing And serviceTel.Length > 0 Then
    Cells(currentRow, 2) = Trim(serviceTel(0).innerText)
  Else
    Cells(currentRow, 2) = "未获取到联系电话"
  End If
  
  ' 销毁对象释放资源
  ie.Quit
  Set ie = Nothing
  Set html = Nothing
End Sub

批量抓取优化建议

  • 可将CS开头的编号预先存在Excel某一列,循环读取编号拼接成目标URL,即可实现批量抓取
  • 批量抓取时每次请求间隔2-3秒,避免触发站点反爬规则被封禁IP
  • 可增加错误捕获逻辑,遇到加载失败的页面自动标记后跳过,不影响整体批量任务运行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 20:09:00