我需要从大量文本中删除HTML。如果我能找到一个实现java.io.Reader的类来包装另一个Reader,并转换文本以省略所有HTML标记(或者用空格替换它们),那将会很酷。它需要能够处理格式错误的HTML。
表现很重要。我需要尽快处理许多千兆字节的文本。执行此操作的常规方法是将我的HTML读入String,将其解析为DOM树,然后迭代遍历提取文本的节点。不幸的是,这太慢了。我认为实现必须基于某种低级词法分析器。
任何人都知道可以执行此操作的库吗?
答案 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解析器更快,更节省空间。