代码之家  ›  专栏  ›  技术社区  ›  Tyler

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

  •  3
  • Tyler  · 技术社区  · 16 年前

    我有一些需要解析和清理的HTML文件,它们偶尔会有带有特殊字符的内容,如<>,“,等等,这些都没有被正确地逃脱。

    我尝试过通过jTidy运行这些文件,但我能做的最好的事情就是省略它认为格式不正确的html内容。是否有一个不同的库只会转义格式错误的片段而不是忽略它们?如果没有,关于哪个库最容易修改的建议是什么?

    澄清:

    示例输入:<p>诸如此类<M+1>布拉赫</p>

    所需输出:<p>诸如此类;书信电报;M+1和;燃气轮机;布拉赫</p>

    4 回复  |  直到 16 年前
        1
  •  1
  •   Adam Batkin    16 年前

    你也可以试试 TagSoup . TagSoup散发出普通的老味道 SAX 所以最终您会得到一个格式良好的XML文档。

    我在TagSoup方面运气很好,而且我总是惊讶于它能很好地处理构造糟糕的HTML文件。

        2
  •  0
  •   Tyler    16 年前

    最终,我通过先运行正则表达式,然后运行未修改的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;
    }
    
        3
  •  0
  •   Steve Czetty Wilko van der Veen    14 年前

    HTML cleaner

    HtmlCleaner是用Java编写的开源HTML解析器。在上找到HTML 网通常是脏的,格式不正确,不适合进一步使用 处理。对于此类文件的任何严重消耗,都是必要的 必须先清理残局,把订单送到标签上, 属性和普通文本。对于给定的HTML文档,HtmlCleaner 它遵循大多数web浏览器使用的类似规则,以便 用于标记筛选和平衡的规则集。

        4
  •  0
  •   Abdul Rahman Rodrigo    13 年前

    好吧,我猜是这个。使用以下代码,会有所帮助。

    javax.swing.text.html.HTML