- 通过 HTTP 协议下载网页源代码。
- 对源代码进行解析,定位到目标文本的位置。
- 使用字符串处理函数截取目标文本。
下面我将为你详细讲解每一步,并提供完整的代码示例和多种提取方法。

(图片来源网络,侵删)
第一步:获取网页源代码
易语言本身没有内置的 HTTP 组件,我们需要使用第三方 DLL 来实现,最常用、最稳定的是 wininet.dll,它是 Windows 系统自带的,无需额外下载。
示例代码:获取网页源代码
.版本 2
.程序集 窗口程序集_启动窗口
.子程序 __启动窗口_创建完毕
.局部变量 hInternet, 整数型
.局部变量 hConnect, 整数型
.局部变量 hRequest, 整数型
.局部变量 szUrl, 文本型
.局部变量 szAgent, 文本型
.局部变量 dwFlags, 整数型
.局部变量 dwContext, 整数型
.局部变量 lpBuffer, 整数型
.局部变量 dwBufferLength, 整数型
.局部变量 dwNumberOfBytesRead, 整数型
.局部变量 htmlSource, 文本型
' --- 配置信息 ---
szUrl = “http://www.example.com” ' 替换成你要抓取的网址
szAgent = “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36”
dwFlags = 0x4000000 ' INTERNET_FLAG_NO_CACHE_WRITE
dwContext = 0
' --- 开始获取 ---
.(真 = InternetOpenA(szAgent, 0, , , 0))
hInternet = 返回值
.(真 = InternetConnectA(hInternet, “www.example.com”, 80, , , 1, 0, 0))
hConnect = 返回值
.(真 = HttpOpenRequestA(hConnect, “GET”, , , , , dwFlags, 0))
hRequest = 返回值
.(真 = HttpSendRequestA(hRequest, , 0, , 0))
' 动态分配内存来接收数据
dwBufferLength = 1024 ' 初始缓冲区大小
lpBuffer = 分配内存(dwBufferLength)
htmlSource = “”
.循环判断首 ()
.(真 = InternetReadFile(hRequest, lpBuffer, dwBufferLength, dwNumberOfBytesRead))
.(dwNumberOfBytesRead = 0)
跳出循环 ()
.否则
' 将读取到的二进制数据转换为文本并追加到源码变量中
htmlSource = htmlSource + 到文本(lpBuffer, dwNumberOfBytesRead, #编码_UTF_8)
' 重新分配内存,为下一次读取做准备
释放内存(lpBuffer)
lpBuffer = 分配内存(dwBufferLength)
.如果结束
.否则
跳出循环 ()
.如果结束
.循环尾 ()
' --- 释放资源 ---
释放内存(lpBuffer)
.如果结束
HttpCloseHandle(hRequest)
.如果结束
InternetCloseHandle(hConnect)
.如果结束
InternetCloseHandle(hInternet)
.如果结束
输出调试文本(“网页源代码获取成功!”)
输出调试文本(“源码长度: ” = 到文本(取文本长度(htmlSource)))
输出调试文本(“前200个字符: ” = 取文本左边(htmlSource, 200))
代码解释:
InternetOpenA: 初始化 WinINet API,创建一个会话句柄。InternetConnectA: 连接到指定的服务器(www.example.com)。HttpOpenRequestA: 创建一个 HTTP 请求句柄。HttpSendRequestA: 发送 HTTP 请求。InternetReadFile: 循环读取服务器返回的数据,因为一次可能读不完所有内容,所以需要循环,直到读取的字节数为 0。分配内存/释放内存: WinINet API 返回的是二进制数据,我们需要动态分配内存来接收它,读取完成后必须释放,防止内存泄漏。到文本(lpBuffer, dwNumberOfBytesRead, #编码_UTF_8): 这是关键一步,将二进制数据转换为 UTF-8 编码的文本。注意:如果目标网站是 GBK 等其他编码,你需要相应地修改编码参数,#编码_GBK。
第二步和第三步:从源码中提取中间文本
获取到 htmlSource 后,接下来的任务就是解析它,提取文本主要有两种方法:
- 基于标签和ID(推荐):如果你知道目标文本在哪个 HTML 标签里,并且这个标签有唯一的
id或class,这是最准确、最稳定的方法。 - 基于固定字符串(简单但脆弱):如果目标文本前后有固定的、唯一的字符串作为“锚点”,可以用这种方法,但缺点是,如果网站改版,这些字符串变了,代码就会失效。
基于标签和ID提取(最推荐)
假设我们要从某个网页中提取 id 为 main-content 的 <div> 标签内的所有文本。

(图片来源网络,侵删)
示例:提取 <div id="main-content">...</div> 中的内容
.版本 2
.子程序 提取标签内容, 文本型, 公开, 参数 htmlSource, 文本型, 参数 targetTag, 文本型, 参数 targetId, 文本型
.局部变量 startPos, 整数型
.局部变量 endPos, 整数型
.局部变量 fullTag, 文本型
.局部变量 content, 文本型
' 1. 查找开始标签的位置,<div id="main-content">
fullTag = “<” + targetTag + ” id=\”” + targetId + ”\””
startPos = 寻找文本(htmlSource, fullTag)
.(startPos = -1)
返回 “” ' 未找到目标标签
.如果结束
' 2. 找到开始标签的结束位置 ">"
startPos = 寻找文本_倒序(htmlSource, “>”, startPos + 取文本长度(fullTag))
.(startPos = -1)
返回 “” ' 标签格式不正确
.如果结束
startPos = startPos + 1 ' 移动到 ">" 的下一个字符
' 3. 查找对应的结束标签的位置,</div>
endPos = 寻找文本(htmlSource, “</” + targetTag + “>”, startPos)
.(endPos = -1)
返回 “” ' 未找到结束标签
.如果结束
' 4. 截取标签内的内容
content = 取文本中间(htmlSource, startPos, endPos - startPos)
' 可选:移除标签内的所有子标签,只保留纯文本
content = 替换文本(content, “<[^>]+>”, “”, , , #假) ' 使用正则表达式移除所有HTML标签
返回 content
.子程序 __启动窗口_创建完毕
' ... (这里放上面第一步获取 htmlSource 的代码) ...
' 假设我们已经获取到了 htmlSource
' 调用子程序来提取内容
.(htmlSource ≠ “”)
.局部变量 extractedText
extractedText = 提取标签内容(htmlSource, “div”, “main-content”)
.(extractedText ≠ “”)
信息框(“成功提取到文本:” = 取文本左边(extractedText, 100), 0, , )
.否则
信息框(“未找到目标ID或提取失败!”, 0, , )
.如果结束
.如果结束
代码解释:
提取标签内容:这是一个封装好的通用子程序,可以复用。fullTag:构建要查找的开始标签字符串,如<div id="main-content">。寻找文本:定位开始标签和结束标签的位置。取文本中间:根据找到的起始和结束位置,截取出中间的内容。替换文本(..., “<[^>]+>”, “”, ...):这是一个非常有用的技巧,使用正则表达式将截取到的内容中所有的 HTML 标签(如<p>,<a href="...">)替换为空字符串,从而得到纯文本。
基于固定字符串提取
假设我们要提取一段被 <p class="summary"> 和 </p> 包围的文本。
示例:提取 “ ” 和 “
.版本 2
.子程序 __启动窗口_创建完毕
' ... (这里放上面第一步获取 htmlSource 的代码) ...
' 假设我们已经获取到了 htmlSource
.(htmlSource ≠ “”)
.局部变量 startMarker, 文本型
.局部变量 endMarker, 文本型
.局部变量 startPos, 整数型
.局部变量 endPos, 整数型
.局部变量 extractedText, 文本型
startMarker = “<p class=\”summary\”>”
endMarker = “</p>”
' 1. 查找开始标记的位置
startPos = 寻找文本(htmlSource, startMarker)
.(startPos = -1)
信息框(“未找到开始标记!”, 0, , )
返回 ()
.如果结束
' 2. 找到开始标记的结束位置
startPos = startPos + 取文本长度(startMarker)
' 3. 从开始标记之后的位置,查找结束标记的位置
endPos = 寻找文本(htmlSource, endMarker, startPos)
.(endPos = -1)
信息框(“未找到结束标记!”, 0, , )
返回 ()
.如果结束
' 4. 截取中间的文本
extractedText = 取文本中间(htmlSource, startPos, endPos - startPos)
信息框(“成功提取到文本:” = 取文本左边(extractedText, 100), 0, , )
.如果结束
代码解释:
这种方法逻辑更简单,直接使用 寻找文本 定位前后两个独特的字符串,然后用 取文本中间 截取,它的缺点是,如果网站结构稍作修改,比如把 class="summary" 改成 class="desc",或者前后多加了一个换行符,代码就会失败。
总结与建议
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 基于标签和ID | 稳定、准确、抗网站改版能力强 | 需要了解目标网站的 HTML 结构,代码稍复杂 | 强烈推荐,几乎所有需要精确抓取的场景都应使用此方法。 |
| 基于固定字符串 | 简单、快速,代码量少 | 脆弱、不稳定,网站任何微小改动都可能导致失败 | 快速抓取、测试,或者目标文本前后有绝对不变的“锚点”时。 |
对于你的需求“取网页中间文本”,我强烈建议你使用 方法一,首先在浏览器中打开目标网页,右键“检查”元素,找到你想要的那段文本所在的 HTML 标签,看看它有没有唯一的 id 或 class,然后用方法一的代码进行提取,这样最可靠。
