Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

Альтернативно Neko.

Ответ 2

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

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

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

С Java 5 необходимые XML-функции — называемый JAXP API — теперь встроены в 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 может быть несколько громоздким, но после стольких лет его использования я больше не возражаю.

Ответ 3

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

Ответ 4

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