在通过Jsoup解析Jspx文件时,我注意到遇到新行并且如果存在关闭的html标记,那么jsoup将把内容视为标记之外。另外,我不希望内容存在于两者之间的输出中。
例如: -
我的jspx文件: -
<div xmlns:spring="http://www.springframework.org/tags"
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:util="urn:jsptagdir:/WEB-INF/tags/util"
xmlns:jsp="http://java.sun.com/JSP/Page">
<div> I only require this text </div>
<script type="text/javascript">
var myVar= '${myVar}',
var myVar1= '${myVar1}',
var myVar2= '${myVar2}',
var myVar3= '${myVar3}',
var myVar4= '${myVar4}';
</script>
在java代码中: -
Document doc = Jsoup.parse(s);
String text = doc.body().text();
现在,当我运行此代码时: -
实际O / P: -
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:util="urn:jsptagdir:/WEB-INF/tags/util"
xmlns:jsp="http://java.sun.com/JSP/Page">
I only require this text
var myVar= '${myVar}',
var myVar1= '${myVar1}',
var myVar2= '${myVar2}',
var myVar3= '${myVar3}',
var myVar4= '${myVar4}';
预期是: -
I only require this text
添加评论时会发生同样的事情,在几行后我关闭评论然后它也会在输出中显示(“ - &gt;”)。
我可能做错了或者可能没有意识到Jsoup的完整范围。任何人都可以帮我这个吗?
感谢。
答案 0 :(得分:1)
使用给定的输入和命令,JSoup实际上正在做正确的事情。
让我们分解一下:
Document doc = Jsoup.parse(s);
当提供要解析的任意String时,JSoup会将其包装在<html>
和<body>
标记中,以使得Document
有效。
String text = doc.body().text();
现在您要求all the text of the document's body
and all its children。因此,JSoup很高兴地为您提供了这样的解决方案 - 剥离它识别的标签并为您留下超出您想要的标签。
JSoup的真正威力来自于select()
method on Elements
,因此我们可以使用它缩小到感兴趣的div
:
String text = doc.body().select("div div").text();
如果您不熟悉CSS和/或JQuery,那么只需在另一个div
内选择div
的元素 - 这应该很好地选择您的目标文本。 / p>
请注意,如果您想要非常安全,最好确定感兴趣的div(例如<div id="mydiv">I only require this text</div>
),然后使用ownText
优先于text
:
String text = doc.body().select("div#mydiv").ownText();
ownText()
only gets the immediate text of this element,所以如果有人将一个子元素添加到#mydiv
,它就不会破坏任何内容/