我有一些需要解析和清理的HTML文件,它們偶爾會有特殊字符如<,>,「等的內容理想的Java庫,用於清理html和轉義畸形的片段
我試過通過jTidy運行這些文件,但是我能做的最好的就是省略它看起來格式不正確的html的內容。是否有一個不同的庫,它只會轉義畸形的碎片而不是忽略它們?如果沒有,關於什麼庫最容易修改的建議?
澄清:
樣品輸入:<p>等等等等< M + 1個>嗒嗒</P >
希望的輸出:<p>等等等等& LT; M + 1個& GT; blah </p >
我有一些需要解析和清理的HTML文件,它們偶爾會有特殊字符如<,>,「等的內容理想的Java庫,用於清理html和轉義畸形的片段
我試過通過jTidy運行這些文件,但是我能做的最好的就是省略它看起來格式不正確的html的內容。是否有一個不同的庫,它只會轉義畸形的碎片而不是忽略它們?如果沒有,關於什麼庫最容易修改的建議?
澄清:
樣品輸入:<p>等等等等< M + 1個>嗒嗒</P >
希望的輸出:<p>等等等等& LT; M + 1個& GT; blah </p >
最終,我通過先運行正則表達式和未修改的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("<", "<");
s = s.replaceAll(">", ">");
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;
}
HtmlCleaner是用Java編寫的開源的HTML解析器。在 上找到的HTML通常是髒的,不合格的,並且不適合進一步處理。對於任何嚴重消耗此類文檔的情況,首先需要清理混亂並將訂單帶給標籤, 屬性和普通文本。對於給定的HTML文檔,HtmlCleaner 對單個元素進行重新排序並生成格式良好的XML。默認情況下, 它遵循類似的規則,大多數Web瀏覽器使用 創建文檔對象模型。但是,用戶可以爲標籤過濾和平衡提供自定義標籤和規則集。
我想TagSoup,但我掙扎。它只是繼續運行,並且從不觸發錯誤處理程序。 – Tyler 2010-03-01 20:16:54
我已經開始修改TagSoup源代碼,它看起來很有希望。將發佈一些代碼,如果我得到它的工作。 – Tyler 2010-03-02 00:43:03