【问题标题】:Jsoup - How to tell if an HTML string is a complete page or a fragment?Jsoup - 如何判断 HTML 字符串是完整页面还是片段?
【发布时间】:2016-08-03 10:29:40
【问题描述】:

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

【问题讨论】:

  • 由于所有htmlheadbody 元素都可以省略,因此完整页面和片段之间的差异很小。可能存在 doctype。

标签: html parsing jsoup


【解决方案1】:

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>

注意&lt;head&gt; 中正确嵌套的&lt;title&gt;


使用 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>

注意&lt;body&gt; 中嵌套不正确的&lt;title&gt;


我的问题是如何识别我的输入是否是片段。不是 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());

【讨论】:

  • 我的问题是如何识别我的输入是否是片段。不是 parse 和 parseBodyFragment 方法的作用。因为如果我有一个片段,我想在不添加正文标签的情况下解析它(保持原样)。
猜你喜欢
  • 2021-06-22
  • 1970-01-01
  • 2010-09-09
  • 2013-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-19
  • 2014-01-11
相关资源
最近更新 更多