news 2026/9/25 10:48:35

html4cj DOM操作实战手册:1分钟获取节点的文本、属性与标签内容

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
html4cj DOM操作实战手册:1分钟获取节点的文本、属性与标签内容

html4cj DOM操作实战手册:1分钟获取节点的文本、属性与标签内容

【免费下载链接】html4cj一个HTML格式解析库项目地址: https://gitcode.com/Cangjie-TPC/html4cj

html4cj 是一个简洁好用的 HTML 解析库,它能把 HTML 字符串解析成 DOM 树,让你在代码中像操作对象一样取出节点的文本、属性和标签内容,特别适合网页数据处理和爬虫场景。本文带你用最短时间掌握 html4cj 的 DOM 操作核心 API。

上图展示了 html4cj 的解析器工作流程:HTML 文本经过字符读取、构建 Token、构建 DOM 树,最终生成可供操作的 Document 对象。

🚀 3步快速上手:解析出你的第一个DOM对象

使用 html4cj 只需三步:导入库 → 调用 parse → 操作节点。

import html4cj.* main(): Int64 { // 第2步:把HTML解析成Document(DOM对象) var doc: Document = Html4cj.parse("<a href=/foo>Hello</a>", "http://127.0.0.1/") // 第3步:用CSS选择器定位节点 var a: Element = doc.select("a").first().getOrThrow() println(a.text()) // Hello println(a.attr("href")) // /foo return 0 }

核心入口是Html4cj.parse静态方法,定义在 html4cj.cj:

方法用途
parse(html, baseUri)解析完整 HTML,baseUri 用于解析相对链接
parse(html)最简单的解析方式,无基准地址
parseBodyFragment(bodyHtml)解析 body 片段,适合局部 HTML

💡小贴士:解析网页时务必传入baseUri(页面真实 URL),这样href="/foo"这类相对路径才能正确还原成绝对地址。

📝 1分钟获取节点文本:text()方法全解

获取节点文本是 DOM 操作最高频的动作,html4cj 提供了几个层次分明的方法:

let p: Element = doc.select("p").first().getOrThrow() p.text() // 元素及其所有子元素的组合文本(已规范化空白) p.ownText() // 仅该元素自身的文本,不含子元素 p.wholeText() // 保留原始空白和换行符的文本 p.hasText() // 判断是否有非空白文本,返回Bool
  • text()定义在 element.cj,最常用,返回解码后的干净文本
  • 批量场景用eachText()一次拿到所有匹配元素的文本列表,定义在 elements.cj
let items: ArrayList<String> = doc.select("li").eachText() // 逐个获取多个列表项的文本,一个方法搞定

⚠️ 注意:text()返回的是纯文本,会剥掉所有标签;如果子元素为空,返回空字符串而非 None。

🎯 精准获取节点属性:attr()与hasAttr()两大招式

属性获取的 API 集中在 Node 基类上,所有节点类型通用:

a.attr("href") // 获取属性值,不存在时返回空字符串 a.hasAttr("href") // 先判断属性是否存在,避免空值歧义 a.id() // 快捷方法:获取id属性 a.className() // 快捷方法:获取class属性文本 a.hasClass("logo") // 判断是否有某个class
  • attr读取实现见 node.cj
  • 判断属性存在用 node.cj 的hasAttr
  • 类名相关快捷方法在 element.cj 起

🔑 进阶:一键把相对URL变绝对地址

这是 html4cj 最实用的功能之一——在属性键前加abs:前缀,自动把相对 URL 转成绝对 URL:

a.attr("abs:href") // 输出 http://127.0.0.1/foo

底层对应absUrl方法,定义在 node.cj,原理是结合解析时传入的baseUri做地址拼接。爬链接时这个技巧能省去大量手工处理。

🏷️ 提取标签内容:html()与outerHtml()一文看懂

"文本"和"标签内容"是两回事:前者是纯文字,后者保留 HTML 结构。

let div: Element = doc.select("div").first().getOrThrow() div.html() // 内部HTML:不含div自身的开始/结束标签 div.outerHtml() // 外部HTML:包含div自身标签的完整片段
方法返回内容典型用途
text()纯文本展示文字、提取标题
html()内部 HTML提取子内容、局部渲染
outerHtml()完整标签 HTML复制整个卡片/区块
  • html()在 element.cj
  • outerHtml()批量版本在 elements.cj

💡 记忆口诀:"text 要文字,html 要里子,outerHtml 要整体"。

✅ 避坑指南:3个常见坑一次说清

坑1:属性不存在时拿到空字符串。attr对不存在的属性返回""而不是报错,建议重要字段先用hasAttr判断,见 elements.cj。

坑2:忘记传 baseUri 导致绝对 URL 失效。abs:href依赖解析时的基准地址,若调用parse(html)时没传 baseUri,abs:前缀拿到的可能还是相对路径。

坑3:选择器没匹配到节点。select("a").first()可能返回 None,记得用.getOrThrow()或直接判空,别裸调方法。

📚 延伸阅读:完整API与源码路径

想深入某个 API 时,直接对照文档和源码效率最高:

  • 完整接口文档(含全部方法签名与示例):doc/feature_api.md
  • 核心解析入口类 Html4cj:html4cj.cj
  • Element 元素节点(文本、类名、选择器):element.cj
  • Elements 批量操作(eachText、outerHtml):elements.cj
  • Node 节点基类(attr、absUrl):node.cj
  • 选择器查询实现:selector.cj

掌握本文的parse→select→text/attr/html这条主线,你就能覆盖 90% 的日常 DOM 操作需求,剩下的特殊场景再查完整 API 文档即可。

【免费下载链接】html4cj一个HTML格式解析库项目地址: https://gitcode.com/Cangjie-TPC/html4cj

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/25 10:47:10

微软E5开发者账号申请配置与保活续订全攻略

申请微软E5开发者账号这个玩法&#xff0c;这几年的热度一直没降过。核心无非就是两点&#xff1a;一是拿到OneDrive 5T的存储空间&#xff0c;二是白嫖一套正版Office 365全家桶。它本质上是微软官方的Microsoft 365开发者计划&#xff0c;给开发者提供一套免费的E5沙盒订阅&a…

作者头像 李华
网站建设 2026/9/25 10:42:04

《计算机基础.pdf》是可执行的知识压缩包

简介&#xff1a;本资源是面向程序员、应届求职者及计算机专业学生的面试核心知识整理&#xff0c;聚焦计算机网络高频考点&#xff0c;解决面试中TCP连接、HTTP协议、DNS解析等关键问题的理解与应答难点。文档以结构化八股文形式呈现&#xff0c;覆盖三次握手与四次挥手原理、…

作者头像 李华
网站建设 2026/9/25 10:39:51

代码随想录/hello-algo学习笔记——二叉树

二叉树的基本概念 二叉树是一种非线性的数据结构&#xff0c;由每个节点一分为二引出两个子节点&#xff08;类似高中生物学到的祖先后代的结构图&#xff0c;但二叉树是一个节点只能有两个子节点&#xff09;。 基本单元&#xff1a;结点。每个节点包含值和两个引用&#xff0…

作者头像 李华