vba打开网页提取检查内容文本csdn
这是开网您要求的以《VBA打开网页提取检查内容文本CSDN》为题的HTML文章。它直接切入核心,页提通过一个具体案例,取检展示了如何使用VBA的查内`XMLHTTP`和`Regex`从CSDN博客页面提取标题与正文文本,并附带了可运行的容文代码示例和关键点说明。 ```html 昨天有个做数据核对的朋友发来一个CSDN博客链接,里面列了十几条配置项,页提他需要把正文里的取检检查点一条条抠出来,手动复制粘贴了半小时,查内眼睛都花了。容文我顺手用VBA写了个小工具,开网五秒钟搞定。页提核心就两步:用 先看代码骨架。下面这段可以直接扔进模块里跑,注意把 代码里那个 再说个实际场景。上周我帮人抓一篇讲“服务器巡检清单”的CSDN文章,正文里有二十多条检查项,每条都是 还有人问能不能直接抓CSDN的“目录”区域。可以,但目录的HTML结构每个模板不一样,有的用 最后提一嘴编码问题。CSDN现在基本都是UTF-8, 代码不长,但够用。你要是想批量抓一个专栏下的所有文章,加个循环遍历URL列表就行。注意别抓太快,CSDN有反爬,间隔设个2秒。我一般用VBA打开网页提取检查内容文本CSDN
XMLHTTP把网页源码拽下来,取检再用正则把需要的查内文本捞出来。别被“网页抓取”这个词吓到,容文VBA干这事比你想象的顺手。targetUrl换成你要抓的CSDN文章地址。我习惯用MSXML2.XMLHTTP,比WinHttpRequest兼容性好,而且不需要额外引用。如果你用的是64位Office,记得把CreateObject里的MSXML2.XMLHTTP改成MSXML2.XMLHTTP.6.0,否则可能报错。Sub GrabCSDNContent() Dim http As Object Dim html As String Dim targetUrl As String Dim regEx As Object Dim matches As Object Dim i As Long targetUrl = "https://blog.csdn.net/xxx/article/details/123456" ' 换成实际链接 Set http = CreateObject("MSXML2.XMLHTTP") http.Open "GET", targetUrl, False http.send If http.Status = 200 Then html = http.responseText Else MsgBox "请求失败,状态码:" & http.Status Exit Sub End If ' 提取文章标题(CSDN标题一般在h1标签里) Set regEx = CreateObject("VBScript.RegExp") regEx.Global = True regEx.IgnoreCase = True regEx.Pattern = "<h1[^>]*>(.*?)</h1>" Set matches = regEx.Execute(html) If matches.Count > 0 Then Debug.Print "标题:" & StripTags(matches(0).SubMatches(0)) End If ' 提取正文中的检查项文本(假设检查项都在li标签里) regEx.Pattern = "<li[^>]*>(.*?)</li>" Set matches = regEx.Execute(html) For i = 0 To matches.Count - 1 Dim itemText As String itemText = StripTags(matches(i).SubMatches(0)) If Len(Trim(itemText)) > 0 Then Debug.Print "检查项 " & (i + 1) & ": " & itemText End If Next i Set regEx = Nothing Set http = Nothing End Sub ' 辅助函数:去掉HTML标签和多余空格 Function StripTags(ByVal raw As String) As String Dim tmp As String tmp = raw ' 去掉所有标签 With CreateObject("VBScript.RegExp") .Global = True .Pattern = "<[^>]+>" tmp = .Replace(tmp, "") End With ' 处理HTML实体 tmp = Replace(tmp, " ", " ") tmp = Replace(tmp, "<", "<") tmp = Replace(tmp, ">", ">") tmp = Replace(tmp, "&", "&") StripTags = Trim(tmp) End FunctionStripTags函数是我临时写的,因为CSDN的正文里经常混着<span>、<code>这些内联标签,直接抓<li>里的内容会带一堆尖括号。用正则把标签全删掉,再替换几个常见的HTML实体,文本就干净了。如果你要提取的是<pre>里的代码块,把正则的<li>改成<pre>就行,但注意代码块里可能有转义字符,得单独处理。XMLHTTP拿到的源码里可能没有正文。这时候得换InternetExplorer.Application或者Selenium,但那就重了。我一般先检查源码里有没有目标文本,没有就放弃——毕竟VBA的优势是轻量,不是万能。 <li>包着。跑上面的代码,Debug.Print直接输出到立即窗口,全选复制到Excel,分列都省了。但有个细节:CSDN的<li>里可能嵌套<ul>,正则匹配会贪婪,导致一条检查项把子列表也吞进去。解决办法是把.*?改成[^<]*?,或者用<li[^>]*>([^<]*)</li>,只抓纯文本。我通常选后者,简单粗暴,反正检查项一般不含内联标签。<div class="toc">,有的用<ul class="markdown-toc">。我的建议是:先手动打开网页,F12看一眼你要抓的那块内容的父级标签,把正则里的标签名换掉就行。别想着写一个通用爬虫,VBA不适合干这个。针对具体页面写具体规则,五分钟的事。XMLHTTP默认按UTF-8解析,但如果你抓到的中文是乱码,试试在send之前加一行http.setRequestHeader "Content-Type", "text/html; charset=utf-8"。我遇到过一次返回GBK编码的老文章,那就得用ADODB.Stream转一下,麻烦得很。所以现在抓之前先看网页源码的<meta charset>,省得后面折腾。Application.Wait Now + TimeValue("00:00:02"),简单有效。
- 随机阅读
- 搜索
-
- 友情链接
-