ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何用vba代码通过正则表达式提取网页中指定的表格?

如何用vba代码通过正则表达式提取网页中指定的表格?

作者:绿色风 分类: 时间:2022-08-17 浏览:76
楼主
kevinchengcw
Q: 如何用vba代码通过正则表达式提取网页中指定的表格?
A: 实现代码如下:
  1. Sub test()
  2. Dim Rule, N&, I&, T&, MaxP&, RegEx As Object, Str$, Arr, Rng As Range
  3. Rule = Array(67, 68)  '设置基金类型表
  4. Set RegEx = CreateObject("vbscript.regexp")  '创建正则表达式
  5. With RegEx
  6.     .Global = True  '全局有效
  7.     .MultiLine = True  '多行有效
  8.     .ignorecase = True  '忽略大小写(网页处理时这个参数比较重要)
  9. End With
  10. Cells.Clear  '清空结果表内容
  11. With CreateObject("msxml2.xmlhttp")  '创建xmlhttp用于读取网页源代码
  12.     For N = LBound(Rule) To UBound(Rule)  '循环结果基金类型数组
  13.         I = 1  '初始化页码
  14.         MaxP = 0  '初始化最大页码值
  15.         Do  '执行循环操作
  16.             .Open "get", "http://quote.stockstar.com/stock/external_fund.aspx?pageid=" & I & "&retype=" & Rule(N), False  '获取对应页源代码
  17.             .send  '发送请求
  18.             Str = .responsetext  '提取返回的网页源代码
  19.             With RegEx
  20.                 .Pattern = "pageid\=(\d+)[^<>]*?\>最后一页\<"  '设置匹配提取最后一页页码数的规则
  21.                 If .test(Str) Then  '如果可以匹配到结果,则
  22.                     T = Val(.Execute(Str)(0).submatches(0))  '通过匹配结果中对应的分组提取对应页码
  23.                     If MaxP < T Then MaxP = T  '如果最后一页页码大于当前最后一页页码,则取最大值
  24.                 End If
  25.                 .Pattern = "(\<table[\s\S]*?序号[\s\S]*?换手率\<[\s\S]*?<\/tr\>)([\s\S]*?\<\/table\>)"  '设置匹配表格的规则(注:匹配内容进行分组处理,分组1为标题内容,分组2为数据内容)
  26.                 If .test(Str) Then  '如果匹配到数据,则
  27.                     If [a1] = "" Then Str = .Execute(Str)(0).Value Else Str = .Execute(Str)(0).submatches(1)  '当A1为空时提取内容含标题行,否则不含标题行
  28.                     .Pattern = "^\s+|(\>)\s+(\<)|\s+$"  '设置规则去除无效的空白字符
  29.                     Str = Replace(Replace(.Replace(Str, "$1$2"), "</tr>", vbCrLf, , , vbTextCompare), "</td>", vbTab, , , vbTextCompare)  '去除空白字符后,将"</tr>"替换为回车换行符,将"</td>"替换为制表符(利用vbTextCompare参数忽略大小写)
  30.                     .Pattern = "\<[^<>]*?\>"  '设置匹配网页控制符内容串
  31.                     Str = .Replace(Str, "")  '替换为空
  32.                     Arr = Split(Str, vbCrLf)  '将结果依回车换行符拆分放入数组
  33.                     If [a1] = "" Then Set Rng = [a1] Else Set Rng = Cells(Rows.Count, 1).End(3).Offset(1)  '确定数据写入的起始位置
  34.                     With Rng.Resize(UBound(Arr) + 1)  '将结果写入并拆分数据到各列中
  35.                         .Value = Application.Transpose(Arr)
  36.                         .TextToColumns Tab:=True
  37.                     End With
  38.                 End If
  39.             End With
  40.             I = I + 1  '页码加1
  41.         Loop While I <= MaxP  '如果页码不大于最后页则继续循环
  42.     Next N
  43. End With
  44. Set RegEx = Nothing  '清空正则项目
  45. End Sub
详见附件及素材源帖。



GetData.rar
2楼
peterchen
感谢老大,有了这个思路,就可以更好的学习VBA了!
3楼
亡者天下
过来学习一下
4楼
icenotcool


5楼
/jy孝文
很强大
6楼
老糊涂
学习正则

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap