JSoup技术问题:如何解析嵌套文本?
嘿,用JSoup提取嵌套文本其实挺简单的,我给你分几种常见场景来讲解,直接上干货!
用JSoup提取嵌套文本的几种实用方法
1. 一键提取元素下所有嵌套文本(自动拼接)
如果你想直接拿到某个元素里所有层级的文本内容,不管它嵌套了多少层标签,用text()方法就可以轻松搞定。这个方法会自动忽略所有HTML标签,把所有子元素的文本拼接成一个字符串。
举个实际例子,假设你要解析的HTML结构是这样的:
<div class="article"> 这是正文开头 <h3>小标题</h3> <p>段落内容<span>这里还有嵌套的span文本</span></p> </div>
对应的JSoup代码实现:
// 假设你已经通过JSoup解析得到了Document对象doc Element articleDiv = doc.selectFirst(".article"); // 提取所有嵌套文本 String fullText = articleDiv.text(); System.out.println(fullText); // 输出结果:这是正文开头 小标题 段落内容这里还有嵌套的span文本
2. 单独获取每个文本节点(保留独立文本块)
如果你不想直接拼接,而是想单独拿到每个层级的文本节点(比如要分别处理不同位置的文本),可以用textNodes()方法,它会返回该元素下所有的文本节点列表,包括子元素里的节点。
代码示例:
Element articleDiv = doc.selectFirst(".article"); List<TextNode> textNodes = articleDiv.textNodes(); // 遍历每个文本节点,过滤掉空白内容 for (TextNode node : textNodes) { String cleanText = node.text().trim(); if (!cleanText.isEmpty()) { System.out.println(cleanText); } } // 输出结果: // 这是正文开头 // 小标题 // 段落内容 // 这里还有嵌套的span文本
3. 只提取当前元素的文本(排除子元素内容)
如果你只想拿到当前元素本身的文本,不想包含子元素里的内容,那就用ownText()方法。它只会返回元素自身的文本,完全忽略子元素的内容。
比如还是刚才的HTML,只想提取<div>本身的文本,不包含<h3>和<p>里的内容:
Element articleDiv = doc.selectFirst(".article"); String divOwnText = articleDiv.ownText().trim(); System.out.println(divOwnText); // 输出:这是正文开头
要是想提取<p>本身的文本,不包含<span>的内容:
Element pTag = doc.selectFirst(".article p"); String pOwnText = pTag.ownText().trim(); System.out.println(pOwnText); // 输出:段落内容
4. 结合选择器精准定位嵌套文本
如果你的目标文本在特定的嵌套结构里,比如只想拿到<span>里的内容,直接用选择器定位到该元素,再调用text()就可以了:
Element spanTag = doc.selectFirst(".article p span"); String spanText = spanTag.text(); System.out.println(spanText); // 输出:这里还有嵌套的span文本
一般来说,上面这几种方法就能覆盖绝大多数提取嵌套文本的需求了。如果遇到特别复杂的嵌套结构,还可以自己写递归逻辑遍历元素,但日常开发里前面的方法完全够用啦~
内容的提问来源于stack exchange,提问作者İbrahim
相关产品推荐
相关产品推荐

