Чтение HTML-файла в DOM-дерево с использованием Java - PullRequest
12 голосов
/ 19 января 2009

Есть ли парсер / библиотека, которая может читать HTML-документ в DOM-дерево, используя Java? Я хотел бы использовать стандартный DOM/Xpath API, предоставляемый Java.

Большинство библиотек, похоже, имеют собственные API для решения этой задачи. Кроме того, преобразование HTML в XML-DOM кажется неподдерживаемым большинством доступных анализаторов.

Есть идеи или опыт с хорошим HTML-парсером DOM?

Ответы [ 6 ]

6 голосов
/ 19 января 2009

JTidy , либо обработав поток в XHTML, затем используя вашу любимую реализацию DOM для повторного анализа, либо используя parseDOM, если вам достаточно ограниченного импа DOM, который дает вам.

В качестве альтернативы Неко .

3 голосов
/ 21 января 2010

Поскольку HTML-файлы, как правило, проблематичны, вам необходимо сначала очистить их с помощью анализатора / сканера. Я использовал JTidy, но никогда не был доволен. NekoHTML работает хорошо, но любой из этих инструментов всегда просто дает лучшее предположение о том, что предполагается. Вы фактически просите позволить программе изменять разметку документа, пока она не будет соответствовать схеме. Это может вызвать структурную (разметка), стиль или потерю контента. Это неизбежно, и вы действительно не будете знать, чего не хватает, если не будете вручную сканировать через браузер (и тогда вам придется также доверять браузеру).

Это действительно зависит от вашей цели & mdash; если у вас есть тысячи уродливых документов с тоннами посторонней (не HTML) разметки, то ручной процесс, вероятно, нецелесообразен. Если вашей целью является точность в нескольких важных документах, то ручное исправление является разумным предложением.

Одним из подходов является ручной процесс многократной передачи источника через правильно сформированный и / или проверяющий синтаксический анализатор в цикле редактирования с использованием сообщений об ошибках, чтобы в конечном итоге исправить сломанную разметку. Это требует некоторого понимания XML, но это не плохое образование.

В Java 5 необходимые функции XML & mdash; называется JAXP API & mdash; теперь встроены в саму Java; вам не нужны внешние библиотеки.

Сначала вы получаете экземпляр DocumentBuilderFactory, устанавливаете его функции, создаете DocumentBuilder (синтаксический анализатор), а затем вызываете его метод parse () с InputSource. InputSource имеет несколько возможных конструкторов, в следующем примере используется StringReader:

import javax.xml.parsers.*;
// ...

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setValidating(false);
dbf.setNamespaceAware(true);
dbf.setIgnoringComments(false);
dbf.setIgnoringElementContentWhitespace(false);
dbf.setExpandEntityReferences(false);
DocumentBuilder db = dbf.newDocumentBuilder();
return db.parse(new InputSource(new StringReader(source)));

Возвращает документ DOM. Если вы не возражаете против использования внешних библиотек, есть также API-интерфейсы JDOM и XOM, и хотя они имеют некоторые преимущества по сравнению с API-интерфейсами SAX и DOM в JAXP, они требуют добавления не-Java-библиотек. DOM может быть несколько громоздким, но после стольких лет его использования я уже не против.

2 голосов
/ 29 августа 2011

Вот ссылка, которая может быть полезна. Это список анализатора HTML с открытым исходным кодом в Java Анализаторы HTML с открытым исходным кодом в Java

0 голосов
/ 08 февраля 2019

Используйте https://jsoup.org, это очень просто, и power.can читать и изменять HTML.

Пример:

Document doc = Jsoup.parse(page);  //page can be a file or string.
Element main = doc.getElementById("MainView");
Elements links = doc.select(".link");

для создания элементов можно использовать j2html, https://j2html.com

0 голосов
/ 19 января 2009

TagSoup может делать то, что вы хотите.

0 голосов
/ 19 января 2009

Парсер Apache Xerces2 должен делать то, что вы хотите.

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