【发布时间】:2010-10-02 05:49:56
【问题描述】:
是否有能够使用 Java 将 HTML 文档读入 DOM 树的解析器/库?我想使用Java提供的标准DOM/Xpath API。
大多数库似乎都有自定义 API 来解决此任务。此外,大多数可用的解析器似乎都不支持将 HTML 转换为 XML-DOM。
对一个好的 HTML DOM 解析器有什么想法或经验吗?
【问题讨论】:
是否有能够使用 Java 将 HTML 文档读入 DOM 树的解析器/库?我想使用Java提供的标准DOM/Xpath API。
大多数库似乎都有自定义 API 来解决此任务。此外,大多数可用的解析器似乎都不支持将 HTML 转换为 XML-DOM。
对一个好的 HTML DOM 解析器有什么想法或经验吗?
【问题讨论】:
【讨论】:
由于 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 可能有点麻烦,但是在使用了这么多年之后,我不再介意了。
【讨论】:
这是一个可能有用的链接。它是 Java 中的开源 HTML 解析器列表 Open Source HTML Parsers in 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's Xerces2 parser 应该做你想做的事。
【讨论】: