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

