在ASP开发中,采集网页HTML内容是常见需求,比如新闻资讯抓取、商品信息整合等,实现采集的核心步骤包括获取目标网页的HTML源码、解析提取所需数据,其中正则表达式是解析HTML的高效工具,本文将详细介绍ASP采集HTML的常用代码及正则采集的实现方法。
获取HTML源码的基础代码
采集前需先获取目标网页的完整HTML内容,ASP中主要通过ServerXMLHTTP组件实现HTTP请求,以下为基础代码模板:
<% ' 创建HTTP请求对象 Set http = Server.CreateObject("MSXML2.ServerXMLHTTP.6.0") ' 设置超时时间(毫秒),避免请求卡死 http.setTimeouts 5000, 5000, 5000, 5000 ' 目标URL(需替换为实际地址) url = "https://example.com/page.html" ' 发送GET请求 http.Open "GET", url, False http.Send ' 检查请求状态(200表示成功) If http.Status = 200 Then html = http.responseText ' 获取HTML源码 ' 可选:处理编码问题(如目标页面为UTF-8,需转换) If InStr(html, "charset=utf-8") > 0 Then html = BytesToBStr(http.responseBody, "utf-8") End If Else Response.Write "请求失败,状态码:" & http.Status End If ' 释放对象 Set http = Nothing ' 字节流转字符串函数(处理编码) Function BytesToBStr(body, charset) Set stream = Server.CreateObject("ADODB.Stream") stream.Type = 1 ' 二进制模式 stream.Open stream.Write body stream.Position = 0 stream.Type = 2 ' 文本模式 stream.Charset = charset BytesToBStr = stream.ReadText stream.Close Set stream = Nothing End Function %>
正则表达式基础与ASP实现
正则表达式(RegExp)是处理字符串模式的工具,ASP通过RegExp
对象调用正则语法,核心属性和方法如下:
- 属性:
Pattern
(正则模式)、IgnoreCase
(忽略大小写)、Global
(全局匹配)。 - 方法:
Test
(测试是否存在匹配)、Execute
(执行匹配返回集合)。
常用正则元字符说明
元字符 | 含义 | 示例 |
---|---|---|
匹配除换行外任意字符 | a.c 匹配 “abc” |
|
匹配前一个字符0次或多次 | a* 匹配 “aaa” 或 “” |
|
匹配前一个字符1次或多次 | a+ 匹配 “aaa” |
|
非贪婪匹配(尽可能少) | 避免过度匹配 | |
d |
匹配数字(0-9) | d{3} 匹配 “123” |
^ |
匹配字符串开头 | ^http 匹配 “https://” |
匹配字符串结尾 | .html$ 匹配 “page.html” |
|
[] |
匹配指定字符集 | [a-z] 匹配小写字母 |
分组(提取内容) | (d{4}) 提取4位数字 |
正则采集实例解析
实例1:采集网页标题(<title>
)
目标:提取HTML中<title>网页标题</title>
文本。
HTML片段:<title>ASP采集教程 - 正则表达式详解</title>
正则表达式:<title>(.*?)</title>
ASP代码:
Set regex = New RegExp regex.Pattern = "<title>(.*?)</title>" regex.IgnoreCase = True regex.Global = False ' 只匹配第一个标题 Set matches = regex.Execute(html) If matches.Count > 0 Then= matches(0).SubMatches(0) ' 获取分组内容 Response.Write "标题:" & title End If Set regex = Nothing
实例2:采集所有链接(<a>
标签的href属性)
目标:提取所有<a href="链接地址">文本</a>
中的链接地址。
HTML片段:<a href="https://example.com">首页</a><a href="/news">新闻</a>
正则表达式:<a[^>]+href=["']?([^"'s>]+)["']?[^>]*>
ASP代码:
Set regex = New RegExp regex.Pattern = "<a[^>]+href=["'"]?([^""'s>]+)["'"]?[^>]*>" regex.IgnoreCase = True regex.Global = True ' 匹配所有链接 Set matches = regex.Execute(html) For Each match In matches href = match.SubMatches(0) ' 提取href值 Response.Write "链接:" & href & "<br>" Next Set regex = Nothing
实例3:采集列表内容(<ul>
下的<li>
标签文本)
目标:提取<ul><li>项目1</li><li>项目2</li></ul>
中的列表项。
HTML片段:<ul><li>ASP正则采集</li><li>HTML解析技巧</li></ul>
正则表达式:<li[^>]*>(.*?)</li>
ASP代码:
Set regex = New RegExp regex.Pattern = "<li[^>]*>(.*?)</li>" regex.IgnoreCase = True regex.Global = True ' 处理换行符:用[sS]代替.匹配任意字符(含换行) regex.Pattern = "<li[^>]*>([sS]*?)</li>" Set matches = regex.Execute(html) For Each match In matches liText = Trim(match.SubMatches(0)) ' 去除首尾空格 Response.Write "列表项:" & liText & "<br>" Next Set regex = Nothing
注意事项
- 编码问题:若目标页面编码非ASP默认(如UTF-8),需用
ADODB.Stream
转换字节流为字符串,避免乱码。 - 贪婪与非贪婪:正则默认为贪婪模式(匹配尽可能多字符),用可改为非贪婪模式,避免跨标签匹配。
- HTML结构复杂性:实际HTML可能含换行、空格、注释等,需用
s*
匹配空白符,或用[sS]
匹配任意字符(含换行)。 - 性能优化:避免复杂正则(如嵌套套用),减少不必要的全局匹配,提升采集效率。
相关问答FAQs
问题1:为什么正则表达式明明看起来正确,却匹配不到数据?
解答:常见原因包括:① 未设置IgnoreCase=True
导致大小写不匹配(如<title>
写成<TITLE>
);② 未处理HTML换行符(如<div>内容</div>
被拆分为多行,需用[sS]
代替);③ 正则模式遗漏了HTML中的空格或特殊属性(如<a href="...">
中的href
前后可能有空格,需用s*
匹配);④ 目标内容被注释(<!-- -->
)或存在于<script>
/<style>
标签内,需额外过滤。
问题2:采集到的链接是相对路径(如/news
),如何转为绝对路径?
解答:需获取目标页面的基础URL(域名+路径),然后拼接相对路径,示例代码:
' 假设目标URL为 "https://example.com/page.html",提取基础域名 baseDomain = "https://example.com" If InStr(href, "://") = 0 Then ' 判断是否为相对路径 If Left(href, 1) = "/" Then ' 绝对路径(如/news) absoluteUrl = baseDomain & href Else ' 相对路径(如news/detail.html) ' 获取当前页面的路径层级(如/page.html -> /) currentPath = Mid(url, InStr(8, url, "/")) ' 从第8位(https://后)找第一个/ currentPath = Left(currentPath, InStrRev(currentPath, "/")) absoluteUrl = baseDomain & currentPath & href End If Else absoluteUrl = href ' 已是绝对路径 End If Response.Write "绝对路径:" & absoluteUrl
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/44692.html