Java работы парсинг xml.

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

Единственные, которые выпрыгивают, - это HtmlUnit и jsoup .

HtmlUnit

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

Jsoup

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

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

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

String url = ""stackoverflow/questions/3152138"";
Document document = new Tidy().parseDOM(new URL(url).openStream(), null);
XPath xpath = XPathFactory.newInstance().newXPath();
Node question = (Node) xpathpile(""//*[id='question']//*[contains(class,'post-text')]//p[1]"").evaluate(document, XPathConstants.NODE);
System.out.println(""Question: "" + question.getFirstChild().getNodeValue());
NodeList answerers = (NodeList) xpathpile(""//*[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 = ""stackoverflow/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).

Резюме

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

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

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

JTidy
NekoHTML
jsoup
TagSoup

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

Благодаря!

Нужен парсинг данных?

Собираем открытые данные с любых веб-сайтов: цены, названия, артикулы, описания, свойства, категории, фото, отзывы, ссылки, тел.номера, e-mail и многое другое.

Написать
img