Java 如何在Jsoup解析中避免周围的html头标记

Java 如何在Jsoup解析中避免周围的html头标记,java,html,parsing,jsoup,Java,Html,Parsing,Jsoup,我尝试使用Jsoup解析给定的html内容。在Jsoup.parse()之后,html输出将html、head和body标记附加到输入。我只想忽略这些 样本输入: <p><b>This <i>is</i></b> <i>my sentence</i> of text.</p> <html><head></head><body><p><

我尝试使用Jsoup解析给定的html内容。在Jsoup.parse()之后,html输出将html、head和body标记附加到输入。我只想忽略这些

样本输入:

<p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>
<html><head></head><body><p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>
    </body></html>
<p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>
******* HTML *******
<html>
 <head></head>
 <body>
  <p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>
 </body>
</html>

*******  XML *******
<p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>
实际输出:

<p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>
<html><head></head><body><p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>
    </body></html>
<p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>
******* HTML *******
<html>
 <head></head>
 <body>
  <p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>
 </body>
</html>

*******  XML *******
<p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>
这是我的文字句子

预期输出:

<p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>
<html><head></head><body><p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>
    </body></html>
<p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>
******* HTML *******
<html>
 <head></head>
 <body>
  <p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>
 </body>
</html>

*******  XML *******
<p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>
这是我的文字句子

请帮助。

原因:
parseBodyFragment()
以及所有其他
parse()
-默认情况下,方法使用HTML解析器。而那些总是添加HTML外壳(
等等)

解决方案: 只是不要使用HTML解析器,而是使用XML解析器

换掉那一行,你的问题就解决了

例子:
final String html=“这是我的文本句子。

”; Document docHtml=Jsoup.parse(html); Document docXml=Jsoup.parse(html,“,Parser.xmlParser()); System.out.println(“*********HTML*********\n”+docHtml); System.out.println(); System.out.println(“*******XML******\n”+docXml);
输出:

<p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>
<html><head></head><body><p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>
    </body></html>
<p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>
******* HTML *******
<html>
 <head></head>
 <body>
  <p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>
 </body>
</html>

*******  XML *******
<p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>
*******HTML*******
这是我的课文句子

*******XML******* 这是我的课文句子


要获得预期的输出,它实际上是:

final String html = "<p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>";
Document doc = Jsoup.parseBodyFragment(html);
doc.outputSettings().prettyPrint(false);

System.out.println(doc.body().html());
final String html=“这是我的文本句子。

”; Document doc=Jsoup.parseBodyFragment(html); doc.outputSettings().prettyPrint(false); System.out.println(doc.body().html());
您可以尝试使用XML解析器,但这并不总是有效的,因为HTML并不总是XML;它通常有未终止的标记,如

。最好还是坚持使用HTML解析器。您可以依赖于有
标记,它们很容易丢弃。只需通过选择body标记获取HTML片段,并请求其HTML

Document doc = Jsoup.parseBodyFragment(html);
        doc.outputSettings().prettyPrint(false);
        System.out.println(doc.select("body").html());

您还可以将Jsoup.parse与HTML解析器一起使用。你所需要做的就是去掉
html
body
包装

这可以通过选择
主体
元素并展开它来完成:

String input = "<p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>";
Node content = Jsoup.parse(input).body().unwrap();
System.out.println(content.html());

这应该对你有帮助@吉坦德拉:我想要这样的财产。这样做的一个潜在缺点是,您没有得到任何HTML整理—XML解析器不关心HTML5结构,而是让内容按原样通过。如果您想要整洁的正文HTML,请使用
Jsoup.parseBodyFragment(HTML.body()这仅在html为xml时有效。不幸的是,如果您有像img标记这样的东西没有终止,xml解析器将假定以下标记在内部。UPPOWED用于警告xml解析器。我几乎做到了这一点,尽管我的jsoup用例是纠正图像。还想在body元素上添加comment.html(),它只是内部html。它不包括周围的主体标记。