簡體   English   中英

如何避免在 Jsoup 解析中圍繞 html head 標簽

[英]How to avoid surrounding html head tags in Jsoup parse

使用 Jsoup 我嘗試解析給定的 html 內容。 在 Jsoup.parse() 之后,html 輸出將 html、head 和 body 標記附加到輸入。 我只想忽略這些。

樣本輸入:

<p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>

爪哇代碼:

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();
        }
    }
}

實際輸出:

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

請幫忙。

原因:

parseBodyFragment()以及所有其他parse()方法默認使用HTML 解析器 而那些總是添加 HTML-Shell( <html>…</html><head>…</head>等)。

解決方案:

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

Document doc = Jsoup.parse(html, "", Parser.xmlParser());

更換那條線,你的問題就解決了。

例子:

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);

輸出:

******* 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>

要獲得預期的輸出,它實際上是:

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

您可以嘗試使用 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());

您也可以將 Jsoup.parse 與 HTML 解析器一起使用。 您需要做的就是去除htmlbody包裝器。

這可以通過選擇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());

通過body()選擇body元素,通過unwrap()移除 body 並且只保留內容。

所以輸出是:

<p><b>This <i>is</i></b> <i>my sentence</i> of text.</p>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM