一个可以跳过HTML标签的java.io.Reader类?

时间:2011-09-16 18:06:00

标签: java html lexer

我需要从大量文本中删除HTML。如果我能找到一个实现java.io.Reader的类来包装另一个Reader,并转换文本以省略所有HTML标记(或者用空格替换它们),那将会很酷。它需要能够处理格式错误的HTML。

表现很重要。我需要尽快处理许多千兆字节的文本。执行此操作的常规方法是将我的HTML读入String,将其解析为DOM树,然后迭代遍历提取文本的节点。不幸的是,这太慢了。我认为实现必须基于某种低级词法分析器。

任何人都知道可以执行此操作的库吗?

5 个答案:

答案 0 :(得分:1)

我过去成功使用过JTidy

它比您需要的更多,因为它本质上是真实HTML的DOM解析器。有趣的是它很健壮;它可以处理标记中的怪癖,就像浏览器一样。

答案 1 :(得分:1)

我假设您想要所有文本,因此获得大多数内容的hackish正则表达式是不合适的。这意味着您至少需要经历解析的第一部分,但希望库在此之后尽可能少地完成。

您可以使用tagsoup为您提供一个不错的低级别sax界面。只需忽略标签,只需收集文本节点的值即可。尽可能简单快捷。

答案 2 :(得分:0)

对于速度,你可能想要一个流解析器。也许Validator.nu

答案 3 :(得分:0)

ParserCallback可能比创建DOM更快吗?

import java.io.*;
import java.net.*;
import javax.swing.text.*;
import javax.swing.text.html.parser.*;
import javax.swing.text.html.*;

public class ParserCallbackText extends HTMLEditorKit.ParserCallback
{
    public void handleText(char[] data, int pos)
    {
        System.out.println( data );
    }

    public static void main(String[] args)
        throws Exception
    {
        Reader reader = getReader(args[0]);
        ParserCallbackText parser = new ParserCallbackText();
        new ParserDelegator().parse(reader, parser, true);
    }

    static Reader getReader(String uri)
        throws IOException
    {
        // Retrieve from Internet.
        if (uri.startsWith("http:"))
        {
            URLConnection conn = new URL(uri).openConnection();
            return new InputStreamReader(conn.getInputStream());
        }
        // Retrieve from file.
        else
        {
            return new FileReader(uri);
        }
    }
}

答案 4 :(得分:0)

正常的方法实际上是直接从文件中解析HTML,没有中间浪费时间和空间的字符串,但是,正如其他海报所说的那样,你必须首先整理HTML,使用JTidy,NekoHMTL从那里我可能会使用XSLT,但如果需要极端性能,可能不会。您仍然可以选择解析器:SAX或StAX解析器比DOM解析器更快,更节省空间。