强悍的足球 · 澜沧江—湄公河合作五年行动计划(2023-2 ...· 4 月前 · |
大方的蚂蚁 · 不知不觉,金庸剧中已有8位女星去世,都是小时 ...· 6 月前 · |
星星上的苦瓜 · 2020年沈阳市政府工作报告· 6 月前 · |
爱旅游的柠檬 · 斗罗大陆:唐三89级,海星斗罗95级,史莱克 ...· 1 年前 · |
酒量小的蟠桃 · 利奥波德二世_利奥波德二世刚果_利奥波德二世 ...· 1 年前 · |
将 The validator.nu HTML Parser 添加到您的列表中,它是HTML5解析算法在Java语言中的一个实现。
从好的方面来说,它是专门为匹配HTML5而设计的,并且是HTML5验证器的核心,因此很有可能匹配未来浏览器的解析行为,达到非常高的准确度。
不利的一面是,没有浏览器的遗留解析完全像这样工作,而且HTML5仍处于草案阶段,可能会发生变化。
在实践中,这样的问题只影响晦涩难懂的角落情况,并且对于所有实际目的来说,都是一个优秀的解析器。
This article 比较了以下解析器的某些方面:
这绝不是一个完整的总结,它是从2008年开始的。但你可能会发现它很有帮助。
我发现 Jericho HTML Parser写得非常好,保持最新(许多解析器都不是),没有依赖性,并且易于使用。
一般信息
几乎所有已知的HTML解析器都实现了
W3C DOM API
( JAXP API的一部分,用于XML处理的Java API ),并返回一个可供JAXP API直接使用的
org.w3c.dom.Document
。主要的区别通常在于所讨论的解析器的特性。大多数解析器在某种程度上对非格式的超文本标记语言(“标签汤”)都是宽宏大量的,比如
JTidy
、
NekoHTML
、
TagSoup
和
HtmlCleaner
。您通常使用这种HTML解析器来“整理”HTML源代码(例如,将HTML有效的
<br>
替换为XML有效的
<br />
),这样您就可以使用W3C DOM和JAXP API以“通常的方式”遍历它。
HtmlUnit
HtmlUnit 提供了一个完全自带的应用程序接口,它可以让你以编程的方式像act浏览器一样工作。例如,输入表单值、单击元素、调用JavaScript等。它不仅仅是一个HTML解析器。它是一个真正的“无GUI的real浏览器”和HTML单元测试工具。
Jsoup
Jsoup 还提供了一个完全自己的应用程序接口。它为您提供了使用 jQuery -like CSS selectors 选择元素的可能性,并提供了一个灵活的API来遍历HTML DOM树以获取感兴趣的元素。
特别是对HTML DOM树的遍历是Jsoup的主要优点。使用过
org.w3c.dom.Document
的人都知道使用冗长的
NodeList
和
Node
API遍历DOM是多么痛苦。诚然,
XPath
让生活变得更容易,但这仍然是另一条学习曲线,最终可能仍然很冗长。
这里有一个例子,它使用一个“普通的”W3C DOM解析器,比如JTidy和XPath来提取问题的第一段和所有回答者的名字(我使用XPath是因为没有它,收集感兴趣的信息所需的代码将增长10倍,而不需要编写实用程序/助手方法)。
String url = "http://stackoverflow.com/questions/3152138";
Document document = new Tidy().parseDOM(new URL(url).openStream(), null);
XPath xpath = XPathFactory.newInstance().newXPath();
Node question = (Node) xpath.compile("//*[@id='question']//*[contains(@class,'post-text')]//p[1]").evaluate(document, XPathConstants.NODE);
System.out.println("Question: " + question.getFirstChild().getNodeValue());
NodeList answerers = (NodeList) xpath.compile("//*[@id='answers']//*[contains(@class,'user-details')]//a[1]").evaluate(document, XPathConstants.NODESET);
for (int i = 0; i < answerers.getLength(); i++) {
System.out.println("Answerer: " + answerers.item(i).getFirstChild().getNodeValue());
}
下面是一个如何使用Jsoup执行完全相同的操作的示例:
String url = "http://stackoverflow.com/questions/3152138";
Document document = Jsoup.connect(url).get();
Element question = document.select("#question .post-text p").first();
星星上的苦瓜 · 2020年沈阳市政府工作报告 6 月前 |