使用Java读取HTML文件,DOM树

问题描述 投票:12回答:6

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

大多数图书馆似乎有自定义的API来解决这个任务。此外,转换HTML到XML-DOM似乎被大多数可用的解析器不支持。

任何想法或经验,具有良好的HTML DOM解析器?

java html dom parsing
6个回答
6
投票

JTidy,或者通过流处理为XHTML,然后使用自己喜欢的DOM实现重新解析,或使用parseDOM如果有限的DOM小鬼,让你就够了。

另外Neko


3
投票

由于HTML文件一般有问题的,你需要先清理它们使用的解析器/扫描器。我用JTidy但从来没有愉快。 NekoHTML工作好,但任何这些工具都始终只是做的是什么意图的最佳猜测。你实际询问,让程序修改文档的标记,直到它符合的模式。这可能会导致结构(标记),风格或内容丢失。这是不可避免的,你不会真正知道缺少了什么,除非你通过浏览器手动扫描(然后你必须得相信浏览器)。

这真的取决于你的目的 - 如果你有成千上万丑文件与外来吨(非HTML)标记,然后手动过程可能是不合理的。如果你的目标是在几个重要文档的准确性,然后手动修复他们的是一个合理的命题。

一种方法是使用所述错误消息,以最终修复损坏标记反复使所述源通过公形成和/或验证解析器,在编辑循环中的手动过程。这确实需要一些XML的理解,但是这不是一个坏的教育来承担。

随着Java 5的必要的XML功能 - 称为JAXP API - 现在已经内置到Java本身;你不需要任何外部库。

你首先获得的DocumentBuilderFactory的实例,设置它的特点,创建的DocumentBuilder(分析器),然后调用其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,虽然这些都在SAX和DOM API在JAXP一些优势,他们确实需要添加非Java库。该DOM可能有点麻烦,但经过这么多年的使用它,我不介意任何更长的时间。


2
投票

下面是可能有用的链接。它是开源的HTML解析器的用Java Open Source HTML Parsers in Java列表


0
投票

TagSoup可以做你想做的。


-1
投票

Apache's Xerces2 parser应该做你想要什么。


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.