Каковы за и против ведущего Java синтаксические анализаторы HTML? [закрытый]

Ища ТАК и Google, я нашел, что существуют некоторые Java синтаксические анализаторы HTML, которые последовательно рекомендуются различными сторонами. К сожалению, трудно найти любую информацию о достоинствах и недостатках различных библиотек. Я надеюсь, что некоторые люди потратили некоторое сравнение этих библиотек и могут совместно использовать то, что они изучили.

Вот то, что я видел:

И если существует главный синтаксический анализатор, который я пропустил, я хотел бы услышать о его за и против также.

Спасибо!

174
задан skaffman 11 December 2010 в 21:28
поделиться

4 ответа

Общие

Практически все известные парсеры HTML реализуют W3C DOM API (часть JAXP API, Java API для обработки XML) и возвращает вам org.w3c.dom.Document обратно, который готов для прямого использования JAXP API . Основные различия обычно заключаются в особенностях рассматриваемого парсера. Большинство синтаксических анализаторов в определенной степени снисходительны и снисходительны к некорректному HTML ("tagsoup"), например JTidy , NekoHTML , TagSoup и HtmlCleaner. . Обычно вы используете этот тип парсеров HTML, чтобы «привести в порядок» исходный HTML-код (например, заменив допустимый HTML
на допустимый XML
), чтобы вы можете пройти его «обычным путем», используя W3C DOM и JAXP API.

Выскакивают только HtmlUnit и Jsoup .

HtmlUnit

HtmlUnit предоставляет полностью собственный API, который дает вам возможность программно действовать как веб-браузер. Т.е. введите значения формы, щелкните элементы, вызовите JavaScript и т. д. Это гораздо больше, чем просто анализатор HTML. Это настоящий "веб-браузер без графического интерфейса пользователя" и инструмент для модульного тестирования HTML.

Jsoup

Jsoup также предоставляет полностью собственный API. Он дает вам возможность выбирать элементы с помощью jQuery -подобных селекторов CSS и предоставляет удобный API для обхода дерева HTML DOM для получения интересующих элементов.

В частности, обход дерева HTML DOM является главной сильной стороной Jsoup. Те, кто работал с org.w3c.dom.Document , знают, как тяжело обходить DOM, используя подробные API NodeList и Node . Конечно, XPath упрощает жизнь, но все же это еще одна кривая обучения, и она может оказаться по-прежнему многословной.

Вот пример, в котором используется «простой» парсер W3C DOM, такой как JTidy, в сочетании с XPath для извлечения первого абзаца вашего вопроса и имен всех ответчиков (я использую XPath, так как без него код, необходимый для сбора В противном случае интересующая информация увеличилась бы в 10 раз без написания служебных / вспомогательных методов).

String url = "http://stackoverflow.com/questions/3152138";
Document document = new Tidy().parseDOM(new URL(url).openStream(), null);
XPath xpath = XPathFactory.newInstance().newXPath();

Node question = (Node) xpath.compile("//*[@id='question']//*[contains(@class,'post-text')]//p[1]").evaluate(document, XPathConstants.NODE);
System.out.println("Question: " + question.getFirstChild().getNodeValue());

NodeList answerers = (NodeList) xpath.compile("//*[@id='answers']//*[contains(@class,'user-details')]//a[1]").evaluate(document, XPathConstants.NODESET);
for (int i = 0; i < answerers.getLength(); i++) {
    System.out.println("Answerer: " + answerers.item(i).getFirstChild().getNodeValue());
}

А вот пример того, как сделать то же самое с Jsoup:

String url = "http://stackoverflow.com/questions/3152138";
Document document = Jsoup.connect(url).get();

Element question = document.select("#question .post-text p").first();
System.out.println("Question: " + question.text());

Elements answerers = document.select("#answers .user-details a");
for (Element answerer : answerers) {
    System.out.println("Answerer: " + answerer.text());
}

Вы видите разницу? Это не только меньше кода, но и Jsoup относительно легко понять, если у вас уже есть умеренный опыт работы с селекторами CSS (например, при разработке веб-сайтов и / или использовании jQuery).

Резюме

Теперь должны быть достаточно ясны плюсы и минусы каждого из них. Если вы просто хотите использовать стандартный JAXP API для его обхода, выберите первую упомянутую группу парсеров. Их довольно . Какой из них выбрать, зависит от предоставляемых функций (насколько упрощена для вас очистка HTML? Существуют ли какие-либо прослушиватели / перехватчики и очистители для конкретных тегов?) И надежность библиотеки (как часто она обновляется / обслуживается / исправляется? ). Если вам нравится модульное тестирование HTML, тогда вам подойдет HtmlUnit.Если вам нравится извлекать определенные данные из HTML (что чаще всего является реальным требованием), тогда Jsoup - это то, что вам нужно.

222
ответ дан 23 November 2019 в 20:32
поделиться

Добавьте HTML-синтаксический анализатор validator.nu , реализацию алгоритма синтаксического анализа HTML5 на Java, в свой список.

С другой стороны, он специально разработан для соответствия HTML5 и лежит в основе валидатора HTML5, поэтому весьма вероятно, что он будет соответствовать поведению синтаксического анализа будущего браузера с очень высокой степенью точности.

С другой стороны, устаревший синтаксический анализ браузеров не работает точно так же, и поскольку HTML5 все еще находится в черновике, он может быть изменен.

На практике такие проблемы затрагивают только неясные угловые случаи, и для всех практических целей это отличный синтаксический анализатор.

7
ответ дан 23 November 2019 в 20:32
поделиться

Я обнаружил, что Jericho HTML Parser очень хорошо написан, поддерживается в актуальном состоянии (чего не делают многие парсеры), не имеет зависимостей и прост в использовании.

7
ответ дан 23 November 2019 в 20:32
поделиться

В этой статье сравниваются некоторые аспекты следующих парсеров:

  • NekoHTML
  • JTidy
  • TagSoup
  • HtmlCleaner

Это далеко не полный обзор, и он датирован 2008 годом. Но вы можете найти его полезным.

13
ответ дан 23 November 2019 в 20:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: