2010-03-01 39 views
3

我有一些需要解析和清理的HTML文件,它們偶爾會有特殊字符如<,>,「等的內容理想的Java庫,用於清理html和轉義畸形的片段

我試過通過jTidy運行這些文件,但是我能做的最好的就是省略它看起來格式不正確的html的內容。是否有一個不同的庫,它只會轉義畸形的碎片而不是忽略它們?如果沒有,關於什麼庫最容易修改的建議?

澄清:

樣品輸入:<p>等等等等< M + 1個>嗒嗒</P >

希望的輸出:<p>等等等等& LT; M + 1個& GT; blah </p >

回答

1

您還可以嘗試TagSoup。 TagSoup會發出常規的舊的SAX事件,所以最終您會看到格式良好的XML文檔。

我對TagSoup的運氣非常好,我總是很驚訝它處理構造不好的HTML文件的效果。

+0

我想TagSoup,但我掙扎。它只是繼續運行,並且從不觸發錯誤處理程序。 – Tyler 2010-03-01 20:16:54

+0

我已經開始修改TagSoup源代碼,它看起來很有希望。將發佈一些代碼,如果我得到它的工作。 – Tyler 2010-03-02 00:43:03

0

最終,我通過先運行正則表達式和未修改的TagSoup第二個來解決此問題。

這裏是我的正則表達式的代碼來逃避未知標籤,如<M+1>

private static String escapeUnknownTags(String input) { 
    Scanner scan = new Scanner(input); 

    StringBuilder builder = new StringBuilder(); 

    while (scan.hasNext()) { 

     String s = scan.findWithinHorizon("[^<]*</?[^<>]*>?", 1000000); 

     if (s == null) { 
      builder.append(escape(scan.next(".*"))); 
     } else { 

      processMatch(s, builder); 
     } 

    } 

    return builder.toString(); 
} 

private static void processMatch(String s, StringBuilder builder) { 

    if (!isKnown(s)) { 
     String escaped = escape(s); 

     builder.append(escaped); 
    } 
    else { 
     builder.append(s); 
    } 

} 

private static String escape(String s) { 
    s = s.replaceAll("<", "&lt;"); 
    s = s.replaceAll(">", "&gt;"); 
    return s; 
} 

private static boolean isKnown(String s) { 
    Scanner scan = new Scanner(s); 
    if (scan.findWithinHorizon("[^<]*</?([^<> ]*)[^<>]*>?", 10000) == null) { 

     return false; 
    } 

    MatchResult mr = scan.match(); 

    try { 

     String tag = mr.group(1).toLowerCase(); 

     if (HTML.getTag(tag) != null) { 
      return true; 
     } 
    } 
    catch (Exception e) { 
     // Should never happen 
     e.printStackTrace(); 
    } 

    return false; 
} 
0

HTML cleaner

HtmlCleaner是用Java編寫的開源的HTML解析器。在 上找到的HTML通常是髒的,不合格的,並且不適合進一步處理。對於任何嚴重消耗此類文檔的情況,首先需要清理混亂並將訂單帶給標籤, 屬性和普通文本。對於給定的HTML文檔,HtmlCleaner 對單個元素進行重新排序並生成格式良好的XML。默認情況下, 它遵循類似的規則,大多數Web瀏覽器使用 創建文檔對象模型。但是,用戶可以爲標籤過濾和平衡提供自定義標籤和規則集。

0

好吧,我懷疑是這樣。使用下面的代碼,它會有所幫助。

javax.swing.text.html.HTML 
+0

是的,你是對的。 – Tyler 2010-04-16 11:29:41