清理HTML和转义不良片段的理想Java库

3
我有一些HTML文件需要解析和清理,它们偶尔会包含特殊字符,比如 <、>、"等未被正确转义的内容。

我尝试运行这些文件通过 jTidy,但最好的结果只是省略看作是格式不正确的内容。是否有其他库可以转义格式不正确的片段而不是省略它们?如果没有,您有什么修改最简单的库的建议吗?

澄清:

示例输入:<p> blah blah <M+1> blah </p>

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

4个回答

1

你也可以尝试使用TagSoup。TagSoup会发出常规的SAX事件,因此最终你会得到一个看起来像是格式良好的XML文档。

我在使用TagSoup时非常幸运,而且我总是惊讶于它处理不良构造的HTML文件的能力有多好。


我正在尝试使用TagSoup,但是遇到了困难。它一直在运行,从未触发错误处理程序。 - Tyler
我已经开始修改TagSoup源代码,看起来很有前途。如果成功了,我会发布一些代码。 - Tyler

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

好的,我猜测是这个问题。使用以下代码,它会有所帮助。

javax.swing.text.html.HTML

0

HTML清除器

HtmlCleaner是用Java编写的开源HTML解析器。Web上的HTML通常是肮脏、不规范且不适合进一步处理的。对于这些文档的任何严肃使用,需要先清理混乱并为标签、属性和普通文本带来顺序。对于给定的HTML文档,HtmlCleaner重新排序各个元素并生成格式良好的XML。默认情况下,它遵循大多数Web浏览器用于创建文档对象模型的类似规则。但是,用户可以提供自定义标签和标签过滤和平衡的规则集。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接