Чтение HTML-файла в DOM-дерево с использованием Java

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

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

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

6 ответов

Решение

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

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

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

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

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

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

Сначала вы получаете экземпляр DocumentBuilderFactory, устанавливаете его функции, создаете DocumentBuilder (parser), затем вызываете его метод 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 может быть несколько громоздким, но после стольких лет его использования я уже не против.

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

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

Используйте 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/

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

Другие вопросы по тегам