理想的Java库,用于清理html和转义格式错误的片段

时间:2010-03-01 19:12:27

标签: java html parsing

我有一些需要解析和清理的HTML文件,并且它们偶尔会包含特殊字符的内容,例如&lt ;,>,“等等,这些内容尚未正确转义。

我已尝试通过jTidy运行文件,但我能做的最好的事情就是省略它看到的格式错误的HTML内容。是否有一个不同的库可以逃脱畸形的片段而不是省略它们?如果没有,关于哪个库最容易修改的任何建议?

澄清:

样本输入:< p> blah blah< M + 1> blah< / p>

期望的输出:< p> blah blah& lt; M + 1& gt; blah< / p>

4 个答案:

答案 0 :(得分:1)

您也可以尝试TagSoup。 TagSoup会发出常规的旧SAX事件,因此最终会得到一个结构良好的XML文档。

我对TagSoup运气很好,我总是对处理构造不良的HTML文件感到惊讶。

答案 1 :(得分: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;
}

答案 2 :(得分:0)

HTML cleaner

  

HtmlCleaner是用Java编写的开源HTML解析器。找到HTML   网络通常很脏,形成不良,不适合进一步使用   处理。对于任何严重消费此类文件,它是   必须首先清理混乱并将订单带到标签,   属性和普通文本。对于给定的HTML文档,HtmlCleaner   重新排序单个元素并生成格式良好的XML。默认情况下,   它遵循大多数Web浏览器使用的类似规则   创建文档对象模型。但是,用户可以提供自定义标签和   用于标记过滤和平衡的规则集。

答案 3 :(得分:0)

好的,我怀疑是这样的。使用以下代码,它会有所帮助。

javax.swing.text.html.HTML