
本文详解 jsoup 中基于 css 选择器和 dom 遍历两种主流方式提取目标文本(如“Сегодня в 13:52”),涵盖选择器语法、链式查询、边界校验及常见陷阱,助开发者高效、健壮地解析结构化 html。
本文详解 jsoup 中基于 css 选择器和 dom 遍历两种主流方式提取目标文本(如“Сегодня в 13:52”),涵盖选择器语法、链式查询、边界校验及常见陷阱,助开发者高效、健壮地解析结构化 html。
在 Web 抓取与 HTML 解析场景中,Jsoup 是 Java 生态中最常用、最可靠的库之一。其核心优势在于简洁的 CSS 选择器语法和直观的 DOM 操作 API。针对用户提供的 HTML 片段——一个包含多组
- 列表嵌套在特定 data-test-component="ProductStats" 的
✅ 方案一:纯 CSS 选择器(推荐 —— 简洁、可读性强)
Jsoup 支持标准 CSS 选择器,无需 XPath 即可实现精准定位。观察结构可知:
- 外层
- 具有属性 data-test-component="ProductStats"
- 内层
- 是其唯一子元素
- 目标
- 是
- 的最后一个
- 元素 (注意:不是最后一个子节点,因为
- 和
- 交替出现)
- 是
因此,可组合使用属性选择器 + 子元素选择器 + 伪类:
Document doc = Jsoup.parse(htmlString); // htmlString 即原始 HTML 字符串 // 方式1:直接定位到目标
? 补充说明:dd:last-of-type 匹配
htmlppt.skill下载把任意文章或文档内容转换成精美的全屏翻页 HTML 演示文件(幻灯片风格)。当用户发来一篇文章、文档链接、Markdown 内容、或粘贴的文本,并且希望生成演示用的 HTML 时触发。支持任意内容来源:iWiki 链接、KM 链接、本地文件路径、直接粘贴的文本。生成的 HTML 文件保存到本地工作区,并通过企微直接发送给用户。触发词示例:帮我把这篇文章做成PPT、转成演示文档、生成HTML幻灯片、做个演示、转成可以演示的格式、article to deck、make a slide。
内最后一个
- 元素(语义准确);若需更严格限定为「倒数第一个
- 」,也可用 dd:nth-last-of-type(1)。
✅ 方案二:分步 DOM 遍历(适合动态/复杂结构)
当选择器难以一次性表达逻辑(如需根据前序
Element li = doc.selectFirst("li[data-test-component=ProductStats]");
if (li != null) {
Element dl = li.selectFirst("dl[data-test-component=DescriptionList]");
if (dl != null) {
// 获取所有
该方式逻辑清晰、易于调试,且天然支持空值防护(通过 selectFirst() 和判空)。
⚠️ 关键注意事项
- 避免 child() 索引硬编码:原文答案中使用 li.child(0).child(...) 依赖 DOM 树形结构顺序,极易因 HTML 微小变动(如注释、空格、新增子节点)而失效。应优先使用语义化选择器(如 select("dl"))。
- 始终校验非空:select() 返回 Elements(可能为空列表),selectFirst() 返回 Element(可能为 null),务必判空再调用 .text() 或 .child(),否则触发 NullPointerException。
- 区分 text() 与 ownText():text() 获取含子元素文本的合并结果;ownText() 仅获取当前元素自身文本(无子节点内容),本例中二者等效,但需按需选用。
- 编码与字符集:确保 Jsoup.parse() 时指定正确 charset(如 Jsoup.parse(html, "UTF-8")),避免俄文等 Unicode 字符乱码。
✅ 总结
提取 "Сегодня в 13:52" 的最佳实践是:
doc.select("li[data-test-component=ProductStats] dl dd:last-of-type").first().text()
——一行代码完成选择、安全取值与文本提取,兼具性能、可读性与鲁棒性。掌握 CSS 选择器组合技巧(属性、类型、伪类),远胜于脆弱的索引遍历。在真实项目中,建议将选择器封装为常量,并配合单元测试验证 HTML 结构变更时的兼容性。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











