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

如何使用VBA爬取网页并统计指定HTML元素的数量?

用VBA爬取并统计目标HTML元素数量的方案

嘿,我来帮你搞定用VBA实现网页爬取并统计指定HTML元素数量的需求!下面是一步步的实战方案,代码都是可以直接用的~

一、先做好准备工作

在VBA编辑器里,你得先启用两个必要的引用:

  • 打开VBA编辑器(按Alt+F11),点击顶部菜单的「工具」→「引用」
  • 找到并勾选 Microsoft Internet Controls 和 Microsoft HTML Object Library,点击确定

二、完整代码示例

这个代码会打开IE浏览器加载目标网页,然后统计你提到的两类元素数量:所有带score_row类的div,以及datatable容器下的子元素(包括form、no_data等)

Sub CountHTMLElements()
    Dim ie As InternetExplorer
    Dim htmlDoc As HTMLDocument
    Dim targetURL As String
    Dim scoreRowDivs As IHTMLElementCollection
    Dim dataTableDiv As HTMLDivElement
    Dim childElementsCount As Integer
    
    ' 替换成你要爬取的目标网页URL
    targetURL = "这里替换成你的目标网页地址"
    
    ' 初始化IE对象
    Set ie = New InternetExplorer
    ie.Visible = True ' 设为False可以隐藏浏览器后台运行
    ie.navigate targetURL
    
    ' 等待网页加载完成(避免元素未渲染导致报错)
    Do While ie.Busy Or ie.readyState <> READYSTATE_COMPLETE
        DoEvents
    Loop
    
    ' 获取网页文档对象
    Set htmlDoc = ie.document
    
    ' 统计所有class包含score_row的div数量
    Set scoreRowDivs = htmlDoc.getElementsByClassName("score_row")
    MsgBox "带score_row类的div总数量:" & scoreRowDivs.Length
    
    ' 统计id为datatable的div下的直接子元素数量(包括form、no_data等)
    Set dataTableDiv = htmlDoc.getElementById("datatable")
    If Not dataTableDiv Is Nothing Then
        childElementsCount = 0
        ' 遍历datatable的直接子节点,只统计元素节点(排除空白文本、注释等)
        For Each elem In dataTableDiv.childNodes
            If elem.nodeType = 1 Then ' nodeType=1代表HTML元素节点
                childElementsCount = childElementsCount + 1
            End If
        Next elem
        MsgBox "datatable容器下的直接子元素数量:" & childElementsCount
    Else
        MsgBox "未找到id为datatable的div元素"
    End If
    
    ' 清理对象,释放内存
    ie.Quit
    Set ie = Nothing
    Set htmlDoc = Nothing
    Set scoreRowDivs = Nothing
    Set dataTableDiv = Nothing
End Sub

三、关键代码解释

  • 等待网页加载:Do While ie.Busy Or ie.readyState <> READYSTATE_COMPLETE这行是核心,确保网页完全渲染后再操作,避免因为元素还没加载出来导致找不到的问题。
  • 统计score_row类的div:getElementsByClassName("score_row")会返回所有class属性包含score_row的元素,不管它还有没有其他类名(比如score_header、match_line e_true这些都会被统计到),Length属性就是元素的总数量。
  • 统计datatable的子元素:先用getElementById("datatable")精准定位到目标容器,然后遍历它的childNodes,只计数元素节点(因为子节点里可能包含空白文本、注释这些非元素内容,过滤后结果更准确)。

四、精准统计的额外技巧

如果需要更精准的筛选,比如只统计同时带score_row和match_line类的div,可以用DOM的查询选择器,支持CSS语法,灵活性更高:

Dim matchLineDivs As IHTMLElementCollection
Set matchLineDivs = htmlDoc.querySelectorAll("div.score_row.match_line")
MsgBox "同时带score_row和match_line类的div数量:" & matchLineDivs.Length

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:54:00