Jsoup - 如何判断HTML字符串是完整页面还是片段?

时间:2016-08-03 10:29:40

标签: html parsing jsoup

我找不到一个方法可以判断字符串输入是完整的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>

1 个答案:

答案 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());