VBA之正则表达式(43)-- 从网页中提取指定数据

实例需求:由网页中提取下图中颜色标记部分内容,网页中其他部分与此三行格式相同。


方法1

Sub Demo()
    Dim objRegex As Object
    Dim inputString As String
    Dim objMatches As Object
    Dim objMatch As Object
    Set objRegex = CreateObject("VBScript.RegExp")
    objRegex.Pattern = "id=[^>]+|[^>]+&#[^<]+"
    objRegex.Global = True
    inputString = Cells(1,1).Value
    Set objMatches = objRegex.Execute(inputString)
    For Each objMatch In objMatches
        Debug.Print objMatch
    Next objMatch
End Sub

【代码解析】

第6行代码创建正则对象。

第7行代码设置正则匹配模式。

正则表达式 说明
id=[^>]+ 匹配以id=开头,后面跟一个或者多个除>之外的任意字符
[^>]+&#[^<]+ 匹配以一个或者多个除>之外的任意字符开头,后面为&#,之后为一个或者多个除<之外的任意字符

第8行代码设置正则全局匹配。

第9~11行代码将待处理字符串保存在变量中。

第12行代码执行正则匹配。

第13~15行代码循环遍历匹配结果,第14行代码输出到立即窗口,结果如下图所示。


方法2

使用常规正则匹配模式,此正则模式比较容易理解,不再讲解其含义。

方法1中灵活使用了字符集[^......],限制非某字符,也就实现了以该字符为边界的效果,其匹配模式字符串更简洁。

Sub Demo2()
    Dim objRegex As Object
    Dim inputString As String
    Dim objMatches As Object
    Dim objMatch As Object
    Set objRegex = CreateObject("VBScript.RegExp")
    objRegex.Pattern = "(id=""[^""]+"").*?<text.*?>(.*?)<\/text>"
    objRegex.Global = True
    inputString = Cells(1,1).Value
    Set objMatches = objRegex.Execute(inputString)
    For Each objMatch In objMatches
        Debug.Print "ID: " & objMatch.SubMatches(0)
        Debug.Print "Text: " & objMatch.SubMatches(1)
        Debug.Print "----------------"
    Next objMatch
End Sub

示例数据

<g class="node" transform="translate(1980, 861.0625)" id="node-946327"><rect width="120" height="36" transform="translate(-60,-18)" rx="18" ry="18" stroke="darkseagreen" stroke-width="2" style="fill: rgb(255, 255, 255);"></rect><circle r="18" transform="translate(-42,0)" style="fill: url(&quot;#image-person-old&quot;);"></circle><text transform="translate(18,0)" y="4" text-anchor="middle" style="fill-opacity: 1; font: 12px sans-serif;">Байтайла&#1179;</text><text transform="translate(18,0)" y="10" text-anchor="middle" style="fill-opacity: 1; font: 8px sans-serif;"></text></g>

<g class="node" transform="translate(1980, 907.0625)" id="node-946328"><rect width="120" height="36" transform="translate(-60,-18)" rx="18" ry="18" stroke="darkseagreen" stroke-width="2" style="fill: rgb(255, 255, 255);"></rect><circle r="18" transform="translate(-42,0)" style="fill: url(&quot;#image-person-old&quot;);"></circle><text transform="translate(18,0)" y="4" text-anchor="middle" style="fill-opacity: 1; font: 12px sans-serif;">Байто&#1171;ай</text><text transform="translate(18,0)" y="10" text-anchor="middle" style="fill-opacity: 1; font: 8px sans-serif;"></text></g>

<g class="node" transform="translate(1980, 953.0625)" id="node-946329"><rect width="120" height="36" transform="translate(-60,-18)" rx="18" ry="18" stroke="darkseagreen" stroke-width="2" style="fill: rgb(255, 255, 255);"></rect><circle r="18" transform="translate(-42,0)" style="fill: url(&quot;#image-person-old&quot;);"></circle><text transform="translate(18,0)" y="4" text-anchor="middle" style="fill-opacity: 1; font: 12px sans-serif;">Ораз&#1241;л&#1110;</text><text transform="translate(18,0)" y="10" text-anchor="middle" style="fill-opacity: 1; font: 8px sans-serif;"></text></g>
相关推荐
taller_20001 天前
VBA之正则表达式(48)-- 快速拆分中文语句
正则表达式·正则·拆分中文·中文拆分·中文标点
天狼12222 个月前
java 对人名和电话 脱敏-replaceAll
java·正则
惨遭PUA的程序员2 个月前
学习前端HTML
前端·网页·html标签·初识html
RrEeSsEeTt2 个月前
正则表达式基础学习
正则表达式·正则
applebomb2 个月前
vite server正则表达式
正则·vite·proxy·regexp·转发·server
伊织code3 个月前
MechanicalSoup - 与网站自动交互
爬虫·交互·网站·网页·mechanicalsoup·mechanize
网络研究院3 个月前
什么是 HTTP/3?下一代 Web 协议
网络·网络协议·http·web·网站·技术·网页
程序员正茂4 个月前
Python在QtSide6(PyQt)上加载网页使用OpenCV进行图像处理
python·qt·opencv·视频·网页
谢小涛4 个月前
mysql regexp匹配多个字符串
mysql·mybatis·regexp·正则匹配·concat_ws
red润5 个月前
钉钉开发网页应用JSAPI前端授权鉴权nodejs实现
前端·钉钉·网页·jsapi授权