您现在的位置是:焦点 >>正文

vba打开网页提取检查内容文本csdn

焦点14512人已围观

简介这是您要求的以《VBA打开网页提取检查内容文本CSDN》为题的HTML文章。它直接切入核心,通过一个具体案例,展示了如何使用VBA的`XMLHTTP`和`Regex`从CSDN博客页面提取标题与正文文 ...

这是开网您要求的以《VBA打开网页提取检查内容文本CSDN》为题的HTML文章。它直接切入核心,页提通过一个具体案例,取检展示了如何使用VBA的查内`XMLHTTP`和`Regex`从CSDN博客页面提取标题与正文文本,并附带了可运行的容文代码示例和关键点说明。 ```html VBA打开网页提取检查内容文本CSDN

VBA打开网页提取检查内容文本CSDN

昨天有个做数据核对的朋友发来一个CSDN博客链接,里面列了十几条配置项,页提他需要把正文里的取检检查点一条条抠出来,手动复制粘贴了半小时,查内眼睛都花了。容文我顺手用VBA写了个小工具,开网五秒钟搞定。页提核心就两步:用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, "&nbsp;", " ") tmp = Replace(tmp, "&lt;", "<") tmp = Replace(tmp, "&gt;", ">") tmp = Replace(tmp, "&amp;", "&") StripTags = Trim(tmp) End Function

代码里那个StripTags函数是我临时写的,因为CSDN的正文里经常混着<span>、<code>这些内联标签,直接抓<li>里的内容会带一堆尖括号。用正则把标签全删掉,再替换几个常见的HTML实体,文本就干净了。如果你要提取的是<pre>里的代码块,把正则的<li>改成<pre>就行,但注意代码块里可能有转义字符,得单独处理。

踩坑记录:CSDN有些文章是动态加载的,XMLHTTP拿到的源码里可能没有正文。这时候得换InternetExplorer.Application或者Selenium,但那就重了。我一般先检查源码里有没有目标文本,没有就放弃——毕竟VBA的优势是轻量,不是万能。

再说个实际场景。上周我帮人抓一篇讲“服务器巡检清单”的CSDN文章,正文里有二十多条检查项,每条都是<li>包着。跑上面的代码,Debug.Print直接输出到立即窗口,全选复制到Excel,分列都省了。但有个细节:CSDN的<li>里可能嵌套<ul>,正则匹配会贪婪,导致一条检查项把子列表也吞进去。解决办法是把.*?改成[^<]*?,或者用<li[^>]*>([^<]*)</li>,只抓纯文本。我通常选后者,简单粗暴,反正检查项一般不含内联标签。

还有人问能不能直接抓CSDN的“目录”区域。可以,但目录的HTML结构每个模板不一样,有的用<div class="toc">,有的用<ul class="markdown-toc">。我的建议是:先手动打开网页,F12看一眼你要抓的那块内容的父级标签,把正则里的标签名换掉就行。别想着写一个通用爬虫,VBA不适合干这个。针对具体页面写具体规则,五分钟的事。

最后提一嘴编码问题。CSDN现在基本都是UTF-8,XMLHTTP默认按UTF-8解析,但如果你抓到的中文是乱码,试试在send之前加一行http.setRequestHeader "Content-Type", "text/html; charset=utf-8"。我遇到过一次返回GBK编码的老文章,那就得用ADODB.Stream转一下,麻烦得很。所以现在抓之前先看网页源码的<meta charset>,省得后面折腾。

代码不长,但够用。你要是想批量抓一个专栏下的所有文章,加个循环遍历URL列表就行。注意别抓太快,CSDN有反爬,间隔设个2秒。我一般用Application.Wait Now + TimeValue("00:00:02"),简单有效。

```

Tags:

相关文章

  • 违法内容网站监控

    焦点

    2023年夏天,我接到一个朋友的电话。他在本地开网吧,说市场监督管理局的人找上门,让他配合检查一台服务器。那台机器上存着几百部盗版电影,还有几个境外赌博网站的跳转链接。他一脸无辜:“我就是图省事,从网 ...

    【焦点】

    阅读更多
  • 网站安全检测工具

    焦点

    去年秋天,一个做外贸的朋友半夜给我打电话,说网站首页被挂了一个博彩跳转。我让他别急,先打开浏览器访问自己的域名——果然,移动端访问时直接跳到了境外赌博站。PC端却正常。这种“设备定向”的挂马方式,靠肉 ...

    【焦点】

    阅读更多
  • apache activemq漏洞

    焦点

    2015年10月,安全研究员Matthias Kaiser在ActiveMQ的Web控制台里发现了一个让人后背发凉的问题:攻击者不需要任何凭证,就能通过HTTP请求让服务器反序列化任意Java对象。这 ...

    【焦点】

    阅读更多


友情链接