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实体解码:网页中的特殊字符会以实体编码形式存在(比如
Ö),用htmlfile对象可以快速将其转换为正常显示的字符。 - 循环提取:通过
regex.Execute获取所有匹配项,再遍历matches集合,逐个提取分组中的内容并添加到结果集合里。
内容的提问来源于stack exchange,提问作者Martin Dreher
相关产品推荐
相关产品推荐

