我找不到一个方法可以判断字符串输入是完整的HTML页面还是只是片段(没有<html><body> ... </body></html>
)。
我查看了jsoup实现,发现了parse和parseBodyFragment的实现,但没有根据字符串决定使用它们的方法。
完整HTML的示例(需要正常解析):
<!DOCTYPE html>
<html>
<body>
<h1>My First Heading</h1>
<p>My first paragraph.</p>
</body>
</html>
HTML片段的示例(需要parseBodyFragment):
<div style=\"color:#0000FF\">
<h3>This is a heading</h3>
<p>This is a paragraph.</p>
</div>
答案 0 :(得分:1)
Jsoup.parse
将查找head和body元素并将它们正确嵌套在html标记中。 Jsoup.parseBodyFragment
会将所有内容放在body标记中。无论哪种方式,都将创建一个完整的HTML文档。如果您不确定输入是完整还是片段,请使用解析。
考虑这个带有头元素的片段。
<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>
请注意<title>
中正确嵌套的<head>
。
使用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>
请注意<title>
<body>
。{/ p>
我的问题是如何识别我的输入是否是片段。不 解析和parseBodyFragment方法的作用。因为如果我有 片段,我想解析它而不添加body标签(保留为 是)。
Jsoup会将内容规范化为HTML文档。但是,您可以使用W3C dom和javax.xml.parsers,它们都在JRE中。您可以检查第一个节点是否为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());