2009-05-26 85 views
3

我有一些由Filemaker导出创建的html文件。每个文件基本上都是一个巨大的HTML表格。我想遍历表行并将它们填充到数据库中。我曾尝试与HTMLParser做到这一点,如下所示:如何用Java HTMLParser库解析大型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 
} 

上面的代码可与文件小于1 MB。不幸的是,我有一个4.8 Mbs的html文件,并且出现内存不足错误。

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) 

有没有办法解决这个问题的HTMLParser(我完全新图书馆)更有效的方式,或者我应该使用一个不同的库或方法吗?

回答

5

您是否尝试过增加了JVM

下面的命令行参数的最大堆大小会爬上去512兆字节: -Xmx512M

例如

java -Xmx512M myrunclass 
+0

谢谢,它的工作原理。我投票给你。我会等待接受你的回答,因为我想看看是否有人发布更有效率的方式。 – 2009-05-26 12:47:57

+0

Sergio del Amo,我想你应该接受这个答案,因为没有你喜欢的其他问题。 – Maksim 2012-04-02 00:12:46

1

不要构建一个DOM时,你只需要提取一些信息,你有没有兴趣来执行其对DOM结构表现最佳(亲子关系等查询的一些XPath查询或其他类型)。

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

0

我遇到了同样的问题。看起来HtmlParser存在内存泄漏问题和缺乏文档的问题。使用JProfiler进行分析我注意到解析页面HtmlParser保存了它处理的html代码的链接。我已经尝试在解析结束时调用parser.reset()。它没有帮助。我也看过测试代码,但没有发现任何提示。

因此,我通过调用parser.setInputHTML(“”);来显着减少内存使用量。当我不需要更多的解析器对象时。

P.S.最好分析一下HtmlParser的源代码,但我没有时间为此:)

0

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