Как анализировать большой HTML-файл с помощью библиотеки Java HTMLParser - PullRequest
3 голосов
/ 26 мая 2009

У меня есть несколько html-файлов, созданных при экспорте в Filemaker. Каждый файл представляет собой огромную таблицу HTML. Я хочу перебрать строки таблицы и заполнить их в базе данных. Я попытался сделать это с HTMLParser следующим образом:

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 Мб. К сожалению, у меня есть html-файл 4,8 Мб, и я получаю сообщение об ошибке памяти.

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 (я совершенно новичок в библиотеке), или мне следует использовать другую библиотеку или подход?

Ответы [ 4 ]

5 голосов
/ 26 мая 2009

Вы пробовали увеличить максимальный размер кучи JVM

Следующий аргумент командной строки увеличит его до 512 мегабайт: -Xmx512m

* 1005 Е.Г. *

java -Xmx512M myrunclass
1 голос
/ 26 мая 2009

Не создавайте DOM, если вы хотите извлечь только некоторую информацию, и вы не заинтересованы в выполнении некоторых запросов XPath или других типов запросов, которые лучше всего работают в структуре DOM (отношения родитель-потомок и т. Д.).

Используйте Parser.visitAllNodesWith () вместо Prser.parse ().

0 голосов
/ 01 января 2012

HTMLParser имеет как парсер, так и лексер. Парсер создает модель памяти, но лексер просто уведомляет вас о тегах в файле. Для простого извлечения фиксированных данных лексер может быть наиболее эффективным способом извлечения данных, когда вам приходится отслеживать структуру HTML при обнаружении тегов. У библиотеки HTMlParser некоторое время не было выпуска, поэтому проблемы с памятью вызывают беспокойство, так как кажется, что они вряд ли будут исправлены. Попробуйте JSoup, если вам нужен анализ высокого уровня, так как он имеет мощный синтаксис запроса и очень прост в использовании.

0 голосов
/ 31 декабря 2010

Я столкнулся с той же проблемой. Похоже, HtmlParser страдает от утечек памяти и отсутствия документации. Делая профилирование с помощью JProfiler, я заметил, что при разборе страниц HtmlParser содержит ссылку на обработанный HTML-код. Я пытаюсь вызвать parser.reset () в конце анализа. Это не помогает Я также посмотрел на тестирование кода, но не нашел подсказок.

В результате я резко сократил использование памяти, вызвав parser.setInputHTML (""); когда мне больше не нужен объект парсера.

P.S. лучше проанализировать исходный код HtmlParser, но у меня нет времени на это:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...