
本文详解如何使用 Jsoup 的 CSS 选择器语法高效定位嵌套 HTML 元素(如带 data-test-component 属性的 及其子 ),并安全提取目标文本(如“Сегодня в 13:52”),避免空指针与索引越界。
本文详解如何使用 jsoup 的 css 选择器语法高效定位嵌套 html 元素(如带 data-test-component 属性的 `
在 Web 抓取与 HTML 解析场景中,Jsoup 是 Java 生态中最常用、最直观的库之一。但初学者常因过度依赖 DOM 树遍历(如 child() + 索引)而写出脆弱、难维护的代码。实际上,Jsoup 原生支持强大且语义清晰的 CSS 选择器,可直接表达“获取 ProductStats 列表中最后一组描述项的值”,无需手动计算子节点索引。
以目标 HTML 片段为例:
<li data-test-component="ProductStats" class="sc-qVkRw dDEgow">
<dl data-test-component="DescriptionList" class="sc-ejxegM hEIIuR">
<dt>В избранном</dt>
<dd>1</dd>
<dt>Просмотры</dt>
<dd>2</dd>
<dt>Размещено</dt>
<dd>Сегодня в 13:52</dd>
</dl>
</li>要提取 "Сегодня в 13:52",本质是:定位到 data-test-component="ProductStats" 的 → 找到最后一个
✅ 推荐写法(简洁、健壮、可读性强):
立即学习“前端免费学习笔记(深入)”;
Document doc = Jsoup.parse(htmlString); // 或 Jsoup.connect(url).get()
// 一步定位:li 下的 dl 中的最后一个 dd
Element targetDD = doc.selectFirst("li[data-test-component=ProductStats] dl dd:last-of-type");
if (targetDD != null) {
String postedTime = targetDD.text().trim();
System.out.println(postedTime); // 输出:Сегодня в 13:52
} else {
System.err.println("目标元素未找到,请检查HTML结构或选择器");
}? 关键选择器说明:
- li[data-test-component=ProductStats]:精确匹配具有该 data-* 属性的
- ;
- dl:其直接或后代
- (此处为直接子元素);
- dd:last-of-type:选取
- 内最后一个
- 元素(CSS 标准伪类,Jsoup 完全支持);
- selectFirst(...):安全返回首个匹配元素(避免 Elements.get(0) 的空指针风险)。
⚠️ 注意事项:
- 避免硬编码索引(如 child(5)):HTML 结构微调即导致逻辑断裂;
- select(...) 返回 Elements(可能为空),务必判空;优先用 selectFirst() + null 检查,比 size()>0 && get(0) 更简洁;
- 若需提取特定
- 对应的
- (如“Размещено”右侧的值),可用相邻兄弟选择器:
Element dt = doc.selectFirst("dt:contains(Размещено)"); String value = dt != null ? dt.nextElementSibling().text().trim() : null; - Jsoup 默认不区分大小写匹配标签名和属性名,但 data-test-component 值需严格匹配(含大小写)。
? 总结:掌握 selectFirst() + 组合 CSS 选择器(属性选择器、伪类、后代/子代关系符),是 Jsoup 高效开发的核心能力。它让解析逻辑与 HTML 语义对齐,大幅提升代码可读性、可测试性与长期可维护性。











