如何使用Java HTMLPasser库解析大型HTML文件

如何使用Java HTMLPasser库解析大型HTML文件,java,parsing,Java,Parsing,我有一些由Filemaker导出创建的html文件。每个文件基本上都是一个巨大的HTML表。我希望遍历表行并将它们填充到数据库中。我试着用以下方法来做: String inputHTML = readFile("filemakerExport.htm","UTF-8"); Parser parser = new Parser(); parser.setInputHTML(inputHTML); parser.setEncoding("UTF-8"); NodeList nl = pars

我有一些由Filemaker导出创建的html文件。每个文件基本上都是一个巨大的HTML表。我希望遍历表行并将它们填充到数据库中。我试着用以下方法来做:

String inputHTML = readFile("filemakerExport.htm","UTF-8");
Parser parser = new Parser();
parser.setInputHTML(inputHTML);
parser.setEncoding("UTF-8");    
NodeList nl = parser.parse(null); 
NodeList trs = nl.extractAllNodesThatMatch(new TagNameFilter("tr"),true);
for(int i=0;i<trs.size();i++) {
    NodeList nodes = trs.elementAt(i).getChildren();
    NodeList tds  = nodes.extractAllNodesThatMatch(new TagNameFilter("td"),true);
    // Do stuff with tds
}

有没有更有效的方法来解决HTMLPasser的这个问题(我对这个库一无所知),或者我应该使用不同的库或方法?

您是否尝试过增加JVM的最大堆大小

以下命令行参数将使其最大容量达到512 MB: -Xmx512M

例如


如果您只想提取一些信息,而不想执行某些XPath查询或其他类型的查询(父子关系等),则不要构建DOM


使用Parser.visitAllNodesWith()而不是Prser.parse()。

我也遇到过同样的问题。HTMLPasser似乎受到内存泄漏问题和文档不足的困扰。在使用JProfiler进行评测时,我注意到解析页面HTMLPasser保留了它所处理的html代码的链接。我尝试在解析结束时调用parser.reset()。这没用。我也看过测试代码,但没有发现任何提示

因此,我通过调用parser.setinputtml(“”)大大降低了内存使用率;当我不再需要解析器对象时


另外,最好是分析HTMLPasser的源代码,但我没有时间:)

HTMLPasser同时有一个解析器和一个lexer。解析器构建内存中的模型,但lexer只通知您文件中的标记。对于固定数据的简单提取,lexer可能是提取数据的最有效的方法,您必须在遇到标记时跟踪html的结构。HTMLPasser库已经有一段时间没有发布了,因此内存问题令人担忧,因为它们似乎不太可能得到修复。如果需要高级解析,请尝试JSoup,因为它具有强大的查询语法,并且非常易于使用

谢谢,它起作用了。我投你一票。我会等着接受你的答案,因为我想看看是否有人发布了更有效的方式。塞尔吉奥·德尔·阿莫,我认为你应该接受这个答案,因为没有其他你喜欢的问题。看看org.htmlparser.tests.visitorsTests包,你会发现所有与访问者相关的测试用例。您需要了解的关于与访问者解析的所有信息都在这里。您有一个接近您需要的实现:TagFindingVisitor。TagFindingVisitor=新的TagFindingVisitor(新字符串[]{“LI”、“BODY”、“UL”、“A”});parser.visitAllNodesWith(visitor);
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at org.htmlparser.lexer.Lexer.parseTag(Lexer.java:1002)
    at org.htmlparser.lexer.Lexer.nextNode(Lexer.java:369)
    at org.htmlparser.scanners.CompositeTagScanner.scan(CompositeTagScanner.java:111)
    at org.htmlparser.util.IteratorImpl.nextNode(IteratorImpl.java:92)
    at org.htmlparser.Parser.parse(Parser.java:701)
    at Tools.main(Tools.java:33)
java -Xmx512M myrunclass