Jsoup.parse 将查找 head 和 body 元素并将它们正确嵌套在 html 标记中。 Jsoup.parseBodyFragment 会将所有内容都放在 body 标记中。无论哪种方式,都将创建一个完整的 HTML 文档。如果您不确定您的输入是完整的还是片段的,请使用 parse。
考虑这个带有头部元素的片段。
<title>my title</title>
<div style="color:#0000FF">
<h3>This is a heading</h3>
<p>This is a paragraph.</p>
</div>
使用解析
System.out.println(Jsoup.parse(fragment).html());
输出:
<html>
<head>
<title>my title</title>
</head>
<body>
<div style="color:#0000FF">
<h3>This is a heading</h3>
<p>This is a paragraph.</p>
</div>
</body>
</html>
注意<head> 中正确嵌套的<title>。
使用 parseBodyFragment
System.out.println(Jsoup.parseBodyFragment(fragment).html());
输出
<html>
<head></head>
<body>
<title>my title</title>
<div style="color:#0000FF">
<h3>This is a heading</h3>
<p>This is a paragraph.</p>
</div>
</body>
</html>
注意<body> 中嵌套不正确的<title>。
我的问题是如何识别我的输入是否是片段。不是
parse 和 parseBodyFragment 方法的作用。因为如果我有一个
片段,我想在不添加正文标签的情况下解析它(将其保留为
是)。
Jsoup 会将内容规范化为 HTML 文档。但是,您可以使用 JRE 中的 W3C dom 和 javax.xml.parsers。您可以检查第一个节点是否为 HTML。
import javax.swing.text.html.HTML.Tag;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;
...
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(myInputStream);
Node root = doc.getFirstChild();
boolean isFragment = !root.getNodeName().equals(Tag.HTML.toString());