2016-07-23 79 views
1

我想解析的只是包含尖括號作爲文本一部分的html文檔的文本。如何防止Jsoup在解析文本時擦除文本中的尖括號

例如,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的解析函數實現如下所示,

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,非常感謝任何形式的幫助。 謝謝。

+0

您的HTML似乎無效。請看看[這個答案](http://stackoverflow.com/a/10462413/1992780)。 –

+1

謝謝你的評論!我想一個好的開始就是遍歷元素,並在開始解析之前將文本中的「<」字符轉換爲「<」。 – Joon

回答

0

由於達維德帕斯托雷的評論,這個問題「Right angle bracket in 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); 
    } 
} 

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

相關問題