簡體   English   中英

解析時如何防止Jsoup擦除文本內部的尖括號

[英]How to prevent Jsoup from erasing angle-brackets inside text when parsing

我正在嘗試僅解析html文件的文本,該文件包含尖括號作為文本的一部分。

例如,html文件將如下所示:

<html>
 <head></head> 
 <body> 
  <div>
    <p>1. <someUnicodeString></p> 
    <p>2. <foo 2012.12.26.></p> 
    <p>3. <123 2012.12.26.></p> 
    <p>4. <@ 2012.12.26.></p> 
    <p>5. foobarbar</p> 
  </div>
 </body>
</html>

我希望解析的文本文件的結果如下所示:

1. <someUnicodeString> 
2. <foo 2012.12.26.> 
3. <123 2012.12.26.> 
4. <@ 2012.12.26.> 
5. foobarbar

我正在使用Jsoup的parse函數來實現此目標,如下所示,

Document doc = null;

try {
    doc = Jsoup.parse(new File(path), "UTF-8");
    doc.outputSettings(new Document.OutputSettings().prettyPrint(false));
    doc.outputSettings().escapeMode(EscapeMode.xhtml);

    //set line breaks in readable format
    doc.select("br").append("\\n");
    doc.select("p").prepend("\\n\\n");
    String bodyText = doc.body().html().replaceAll("\\\\n", "\n");
    bodyText = Jsoup.clean(bodyText, "", Whitelist.none(), new Document.OutputSettings().prettyPrint(false));

    File f = new File(textFileName+".txt");
    f.getParentFile().mkdirs();
    PrintWriter writer = new PrintWriter(f, "UTF-8");
    writer.print(Parser.unescapeEntities(bodyText, false));
    writer.close();
} catch(IOException e) {
    //Do something
    e.printStackTrace();
}

但是,一旦Jsoup經歷了解析過程,它將為每個尖括號添加標簽,后跟字符。

<p>1. <someUnicodeString></someUnicodeString></p> 
<p>2. <foo 2012.12.26.></foo></p> 
<p>3. <123 2012.12.26.></p> 
<p>4. <@ 2012.12.26.></p> 
<p>5. foobarbar</p> 

最終產生結果

1.  
2.  
3. <123 2012.12.26.> 
4. <@ 2012.12.26.> 
5. asdasd 

解析時如何防止Jsoup擦除文本內部的尖括號?

還是有辦法讓Jsoup識別某些尖括號不是html元素? (也許使用正則表達式?)

我是Jsoup的新手,非常感謝任何幫助。 謝謝。

感謝Davide Pastore的評論,以及“ HTML中的右括號 ”問題

我可以使用以下代碼解決問題。

doc = Jsoup.parse(new File(path), "UTF-8");
//replace all left-angle tags inside <p> element to "&lt;"
Elements pTags = doc.select("p");
for (Element tag : pTags) {
    //change the boundary of the regex to whatever suits you
    if (tag.html().matches("(.*)<[a-z](.*)")) {
        String innerHTML = tag.html().replaceAll("<(?=[a-z])", "&lt;");
        tag.html(innerHTML);
    }
}

如果你經過轉換的過程“<”,在文本<你開始解析之前,你將能夠在得到正確的輸出。

暫無
暫無

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

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