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

Ros*_*han 16 html java parsing jsoup

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

样本输入:

<p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>
Run Code Online (Sandbox Code Playgroud)

Java代码:

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class HTMLParse {

    public static void main(String args[]) throws IOException {
        try{
            File input = new File("/ab.html");
            String html = FileUtils.readFileToString(input, null);

            Document doc = Jsoup.parseBodyFragment(html);
            doc.outputSettings().prettyPrint(false);
            System.out.println(doc.html());
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

实际产量:

<html><head></head><body><p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>
    </body></html>
Run Code Online (Sandbox Code Playgroud)

预期产出:

<p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>
Run Code Online (Sandbox Code Playgroud)

请帮忙.

oll*_*llo 17

原因:

parseBodyFragment()以及所有其他的parse()-方法使用的HTML解析器默认.而那些加的HTML壳牌(<html>…</html>,<head>…</head>等等).

解决方案:

只是不要使用HTML解析器,而是使用XML解析器 ;-)

Document doc = Jsoup.parse(html, "", Parser.xmlParser());
Run Code Online (Sandbox Code Playgroud)

替换该单行,您的问题就解决了.

例:

final String html = "<p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>";

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);
Run Code Online (Sandbox Code Playgroud)

输出:

******* 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>
Run Code Online (Sandbox Code Playgroud)

  • 一个潜在的缺点是你没有得到任何HTML整理 - XML解析器不关心HTML5结构并让内容按原样进行.如果你想要整理身体HTML,请使用`Jsoup.parseBodyFragment(html).body();` (5认同)
  • 仅当您的html是xml时才有效。不幸的是,如果您有诸如img标签之类的未终止的东西,那么xml解析器将假定以下标签位于其中。 (2认同)

Kon*_*sch 7

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

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());
Run Code Online (Sandbox Code Playgroud)


jwe*_*ase 5

您可以尝试使用XML解析器,但这并不总是有效,因为HTML并不总是XML。它通常具有未终止的标签,例如<img><br>。最好坚持使用HTML解析器。你可以依靠有存在<html><head>以及<body>标签和他们很容易丢弃。只需选择body标记并获取其HTML,即可获取HTML片段。

Document doc = Jsoup.parseBodyFragment(html);
        doc.outputSettings().prettyPrint(false);
        System.out.println(doc.select("body").html());
Run Code Online (Sandbox Code Playgroud)

  • 对有关 xml 解析器的警告投了赞成票。尽管我的 jsoup 用例是校正图像,但我几乎做到了。还想评论 body 元素上的 .html() 仅是内部 html。它不包括周围的主体标签。 (2认同)