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

Excel VBA网页抓取:用正则提取指定div的InnerHTML内容

用VBA正则表达式提取目标div内容的解决方案

当然可以通过正则表达式搞定这个需求!既然你已经拿到了目标容器的innerHTML,我们只需要用VBA的RegExp对象匹配所有符合格式的div标签,再循环提取其中的内容即可。下面是完整的实现方案:

步骤1:添加正则提取的核心函数

首先,我们需要一个函数来处理正则匹配和循环提取,同时处理HTML实体编码(比如Ö转成Ö这类特殊字符):

' 处理HTML实体编码转换,把网页中的特殊字符编码转成正常显示的字符
Private Function DecodeHTMLEntities(ByVal htmlText As String) As String
    Dim objHTML As Object
    Set objHTML = CreateObject("htmlfile")
    objHTML.body.innerHTML = htmlText
    DecodeHTMLEntities = objHTML.body.innerText
    Set objHTML = Nothing
End Function

' 从innerHTML中提取所有目标div的内容,返回一个集合存储结果
Private Function ExtractDivContents(ByVal innerHTML As String) As Collection
    Dim regex As Object
    Dim matches As Object
    Dim match As Object
    Dim result As New Collection
    
    Set regex = CreateObject("VBScript.RegExp")
    With regex
        .Pattern = "<div style=""padding:7px 12px"">(.*?)</div>" ' 匹配目标div,捕获中间内容
        .Global = True ' 开启全局匹配,找到所有符合条件的div
        .IgnoreCase = False ' 严格匹配style属性的写法,避免误匹配
        .MultiLine = True ' 允许跨多行匹配,适配网页换行的情况
    End With
    
    Set matches = regex.Execute(innerHTML)
    
    ' 循环遍历所有匹配结果,提取并解码内容
    For Each match In matches
        result.Add DecodeHTMLEntities(match.SubMatches(0))
    Next match
    
    Set ExtractDivContents = result
    Set regex = Nothing
    Set matches = Nothing
End Function

步骤2:整合现有函数并调用

把你现有的GetInnerHTML函数和上面的提取函数结合,写一个主流程函数来演示完整的使用逻辑:

Private Sub GetAndProcessUIDData()
    Dim targetURL As String
    Dim containerHTML As String
    Dim divContents As Collection
    Dim item As Variant
    Dim i As Integer
    
    targetURL = "https://www.uid.admin.ch/Detail.aspx?uid_id=CHE-105.805.649"
    
    ' 获取目标容器的innerHTML
    containerHTML = GetInnerHTML(targetURL)
    
    ' 检查是否获取成功(如果返回的是错误码则提示失败)
    If Not IsNumeric(Left(containerHTML, 1)) Then
        ' 提取所有div内容
        Set divContents = ExtractDivContents(containerHTML)
        
        ' 遍历输出结果(你可以替换成写入Excel单元格的逻辑)
        i = 1
        For Each item In divContents
            Debug.Print "第" & i & "项内容:" & item
            ' 示例:写入Sheet1的A列
            ' Sheet1.Cells(i, 1).Value = item
            i = i + 1
        Next item
    Else
        MsgBox "获取HTML失败:" & containerHTML
    End If
End Sub

' 你的现有GetInnerHTML函数(优化了页面加载判断,确保完全加载)
Private Function GetInnerHTML(url As String) As String
    Dim i As Long
    Dim Doc As Object
    Dim objElement As Object
    Dim objCollection As Object
    On Error GoTo catch
    
    ' 假设ie是你已经声明并初始化的Internet Explorer对象
    With ie
        .Navigate url
        ' 等待页面完全加载(ReadyState=4表示加载完成)
        While .Busy Or .ReadyState <> 4
            DoEvents
        Wend
        GetInnerHTML = .document.getElementById("cphContent_sectionCoreProperties").innerHTML
    End With
    
    Exit Function
catch:
    GetInnerHTML = Err.Number & " " & Err.Description
End Function

关键细节说明

  • 正则模式:<div style=""padding:7px 12px"">(.*?)</div> 中的(.*?)是非贪婪匹配,确保只捕获当前div标签内的内容,不会错误地跨多个div匹配。
  • HTML实体解码:网页中的特殊字符会以实体编码形式存在(比如&#214;),用htmlfile对象可以快速将其转换为正常显示的字符。
  • 循环提取:通过regex.Execute获取所有匹配项,再遍历matches集合,逐个提取分组中的内容并添加到结果集合里。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:44:51