Ответ 1
JTidy, либо обработкой потока на XHTML, либо использованием вашей любимой реализации DOM для повторного анализа или использования parseDOM, если ограниченный DOM imp, который дает вам достаточно.
Альтернативно Neko.
Есть ли синтаксический анализатор/библиотека, способная читать HTML-документ в дереве DOM с помощью Java? Я бы хотел использовать стандартный DOM/Xpath
API, который предоставляет Java.
Большинство библиотек, похоже, имеют настраиваемый API для решения этой задачи. Кроме того, конвертация HTML в XML-DOM кажется неподдерживаемой большинством доступных парсеров.
Любые идеи или опыт с хорошим парсером HTML DOM?
JTidy, либо обработкой потока на XHTML, либо использованием вашей любимой реализации DOM для повторного анализа или использования parseDOM, если ограниченный DOM imp, который дает вам достаточно.
Альтернативно Neko.
Так как файлы 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 может быть несколько громоздким, но после стольких лет его использования я больше не возражаю.
Вот ссылка, которая может быть полезна. Это список HTML-кода с открытым исходным кодом в Java Открытый HTML-парсер в Java
TagSoup может делать то, что вы хотите.
Apache Xerces2 parser должен делать то, что вы хотите.