Які плюси та мінуси провідних парсерів Java HTML? [зачинено]


175

Шукаючи SO та Google, я виявив, що існує декілька Java HTML-аналізаторів, які постійно рекомендуються різними сторонами. На жаль, важко знайти будь-яку інформацію про сильні та слабкі сторони різних бібліотек. Я сподіваюся, що деякі люди витратили дещо на порівняння цих бібліотек і можуть поділитися тим, що вони дізналися.

Ось що я бачив:

І якщо є великий аналіз, який я пропустив, я хотів би також почути його плюси і мінуси.

Дякую!

Відповіді:


223

Загальні

Майже всі відомі HTML-парсери реалізують API DOM W3C (частина API JAXP, Java API для обробки XML) і дає вам org.w3c.dom.Documentповернення, готове до безпосереднього використання API JAXP. Основні відмінності, як правило, знаходяться в особливостях відповідного аналізатора. Більшість парсерів певною мірою прощають і поблажливіше з не добре сформованим HTML ("tagoup"), як-от JTidy , NekoHTML , TagSoup та HtmlCleaner . Зазвичай ви використовуєте такий тип парсерів HTML, щоб "привести в порядок" джерело HTML (наприклад, замінити HTML-дійсний <br>на допустимий XML <br />), щоб ви могли пройти його "звичайним способом" за допомогою API W3C DOM та JAXP.

Єдині, хто вискакує, - HtmlUnit і Jsoup .

HtmlUnit

HtmlUnit надає повністю власний API, який дає вам можливість діяти як веб-браузер програмно. Тобто введіть значення форми, клацніть елементи, викликайте JavaScript, etcetera. Це набагато більше, ніж поодинокий аналіз HTML. Це справжній інструмент для тестування веб-браузерів без графічного інтерфейсу та HTML.

Jsoup

Jsoup також пропонує повністю власний API. Це дає можливість вибирати елементи за допомогою селекторів CSS, подібних jQuery , та забезпечує гладкий API для переходу до дерева HTML DOM, щоб отримати цікаві елементи.

Зокрема, перехід дерева HTML DOM є основною силою Jsoup. Ті, хто працював з цим, org.w3c.dom.Documentзнають, який страшний біль пройти через DOM за допомогою верболозу NodeListта NodeAPI. Щоправда, 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).

Підсумок

Плюси і мінуси кожного мають бути досить чіткими зараз. Якщо ви просто хочете використовувати стандартний API JAXP для його переходу, тоді перейдіть до першої згаданої групи парсерів. Їх досить багато . Який вибрати, залежить від функцій, які він надає (як чистка HTML спрощена для вас? Чи є деякі слухачі / перехоплювачі та засоби для чищення тегів?) Та надійність бібліотеки (як часто вона оновлюється / підтримується / фіксується? ). Якщо ви хочете спробувати тест HTML, то HtmlUnit - це шлях. Якщо ви хочете витягти конкретні дані з HTML (що більш ніж часто є реальною потребою у світі), то Jsoup - це шлях.


Тут пропущено величезний про / con: Єрихо - це єдиний мені відомий аналізатор, який дозволяє вам маніпулювати неприємним HTML, зберігаючи форматування пробілів та некоректність HTML (якщо такі є).
Адам Гент

3
Jsoupце добре. Я спробував інтерфейсувати його з іншим модулем, який працює з org.w3c.dom.*API. Виявив, що Jsoup не дотримується org.w3c.dom.*контракту
Thamme Gowda

13

У цій статті порівнюються певні аспекти наступних аналізаторів:

  • NekoHTML
  • JTidy
  • TagSoup
  • HtmlCleaner

Це аж ніяк не повний підсумок, і це з 2008 року. Але вам це може бути корисним.


Це відповідь лише за посиланням. Чи можете ви додати відповідні деталі сюди?
Відновіть Моніку - немайнард

7

Додайте до свого списку validator.nu HTML Parser , реалізацію алгоритму розбору HTML5 в Java.

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

З боку мінусу жодний аналіз застарілих браузерів не працює саме так, і оскільки HTML5 все ще знаходиться в чернеті, він може змінюватися.

На практиці такі проблеми зачіпають лише незрозумілі кутові справи, і в усіх практичних цілях є відмінним аналізатором.


7

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


6

Я просто додам відповідь @MJB після роботи з більшістю бібліотек розбору HTML на Java, існує величезна проблема / контент, який опущено: парсери, які зберігають форматування та некоректність HTML при введенні та виведенні.

Це більшість аналізаторів, коли ви змінюєте документ, підірватиме пробіл, коментарі та некоректність DOM, особливо якщо вони схожі на бібліотеку XML.

Єрихо - це єдиний мені відомий аналізатор, який дозволяє вам маніпулювати неприємним HTML, зберігаючи форматування пробілів та некоректність HTML (якщо такі є).


3

Ще два варіанти - HTMLCleaner та HTMLParser .

Я спробував більшість парсерів тут для обходу сканера / вилучення даних, який я розробляв. Я використовую HTMLCleaner для основної роботи з вилучення даних. Це тому, що він підтримує досить сучасний діалект HTML, XHTML, HTML 5, з просторами імен, і він підтримує DOM, тому можливо використовувати його з Java, вбудованою в реалізацію XPath .

Це зробити набагато простіше з HTMLCleaner, ніж деякі інші парсери: JSoup, наприклад, підтримує інтерфейс, подібний до DOM, а не DOM, так потрібна деяка збірка . Джеріко має інтерфейс SAX-лінії, тому знову вимагає певної роботи, хоча Sujit Pal має хороший опис, як це зробити, але врешті-решт HTMLCleaner просто працював краще.

Я також використовую HTMLParser та Jericho для завдання з вилучення таблиць, які замінили деякий код, написаний за допомогою perl's libhtml-tableextract-perl . Я використовую HTMLParser для фільтрування HTML для таблиці, а потім використовую Jericho для розбору. Я погоджуюся з коментарями MJB та Адама про те, що Єрихон в деяких випадках хороший, оскільки він зберігає основний HTML. Він має своєрідний нестандартний інтерфейс SAX, тому для XPath обробка HTMLCleaner краще.

Розбір HTML у Java - напрочуд важка проблема, оскільки, здається, всі аналізатори борються за певні типи неправильного вмісту HTML.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.