使用Java将HTML文件读取到DOM树

时间:2009-01-19 14:12:29

标签: java html dom parsing

是否有解析器/库能够使用Java将HTML文档读入DOM树?我想使用Java提供的标准DOM/Xpath API。

大多数库似乎都有自定义API来解决此任务。此外,大多数可用的解析器似乎都不支持将HTML转换为XML-DOM。

有关HTML DOM解析器的任何想法或经验吗?

6 个答案:

答案 0 :(得分:6)

JTidy,要么将流处理为XHTML,然后使用您喜欢的DOM实现进行重新解析,要么使用parseDOM,如果有限的DOM imp足以让您满意。

另外Neko

答案 1 :(得分:3)

由于HTML文件通常存在问题,因此您需要先使用解析器/扫描程序对其进行清理。我使用过JTidy,但从未高兴过。 NekoHTML工作正常,但任何这些工具总是只是最好地猜测目标。您实际上要求让程序更改文档的标记,直到它符合模式。这可能会导致结构(标记),样式或内容丢失。这是不可避免的,除非你通过浏览器手动扫描(然后你也必须信任浏览器),否则你不会真正知道缺少什么。

这实际上取决于你的目的 - 如果你有成千上万个带有大量无关(非HTML)标记的丑陋文档,那么手动过程可能是不合理的。如果你的目标是一些重要文件的准确性,那么手动修复它们是一个合理的主张。

一种方法是在编辑周期中使用错误消息重复传递源通过格式良好和/或验证的解析器的手动过程,以最终修复损坏的标记。这确实需要对XML有所了解,但这并不是一项糟糕的教育。

使用Java 5,必要的XML特性 - 称为JAXP API - 现在已经内置到Java本身;你不需要任何外部库。

首先获取DocumentBuilderFactory的实例,设置其功能,创建DocumentBuilder(解析器),然后使用InputSource调用其parse()方法。 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文档。如果您不介意使用外部库,那么还有JDOM和XOM API,虽然它们比JAXP中的SAX和DOM API有一些优势,但它们确实需要添加非Java库。 DOM可能有些繁琐,但经过这么多年的使用后我不再介意了。

答案 2 :(得分:2)

这是一个可能有用的链接。这是Java Open Source HTML Parsers in Java

中的开源HTML解析器列表

答案 3 :(得分:1)

TagSoup可以做你想做的事。

答案 4 :(得分:0)

使用https://jsoup.org,这非常简单并且功能强大。可以读取和更改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

答案 5 :(得分:-1)

Apache's Xerces2 parser应该做你想做的事。