【问题标题】:Reading HTML file to DOM tree using Java使用 Java 将 HTML 文件读取到 DOM 树
【发布时间】:2010-10-02 05:49:56
【问题描述】:

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

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

对一个好的 HTML DOM 解析器有什么想法或经验吗?

【问题讨论】:

    标签: java html dom parsing


    【解决方案1】:

    JTidy,要么将流处理为 XHTML,然后使用你最喜欢的 DOM 实现重新解析,要么使用 parseDOM 如果有限的 DOM imp 给你足够了。

    或者Neko

    【讨论】:

    • Neko + Xerces 做得很好。感谢大家的回答
    • 提防 JTidy。它有一个内存泄漏错误。如果你在生产系统中运行它,它最终会崩溃——StackOverflowError 和 OutOfMemoryError。也就是说,它非常擅长修复损坏的 html,以便您可以将其输入 dom 解析器。
    • 有没有一种干净的方式来使用 JTidy 作为 JDOM 或 XOM 的前端以流方式?也就是说,没有先将整个文档读入内存? (并且不使用 PipedInput/OutputStream 和多线程?)或者在这种情况下我最好只使用 Neko?
    • 每个人都建议使用 JTidy 或其变体,但要注意的另一个原因是 JTidy 不是那么可预测的。您将始终从中收到警告,并且很难从该洪流中判断该页面是否真的可以处理(我的经验是几年前的)我记得它对&符号也很挑剔,我认为它更容易恢复来自其他 HTML 故障。
    【解决方案2】:

    由于 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 可能有点麻烦,但是在使用了这么多年之后,我不再介意了。

    【讨论】:

    • 我已经在 XML 中广泛使用了 JAXP,但我发现使用 JAXP 对 HTML 不是很有用,即使在禁用验证或执行您建议的其他步骤之后也是如此。但也许我试图解析的 HTML 离有效的 XHTML 太远了。
    【解决方案3】:

    这是一个可能有用的链接。它是 Java 中的开源 HTML 解析器列表 Open Source HTML Parsers in Java

    【讨论】:

      【解决方案4】:

      TagSoup 可以为所欲为。

      【讨论】:

        【解决方案5】:

        使用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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

          • Xerces 在验证方面非常严格,因此不适合阅读真实世界的 HTML 页面。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-02-06
          • 1970-01-01
          • 2018-01-11
          • 2013-07-22
          • 2020-02-29
          • 1970-01-01
          • 2010-11-28
          相关资源
          最近更新 更多