一般

几乎所有已知的HTML解析器都实现了W3C DOM API(JAXPAPI的一部分,用于XML处理的JavaAPI),并给出org.w3c.dom.DocumentBack,可供JAXPAPI直接使用。主要的区别通常出现在所讨论的解析器的特性中。大多数解析器在一定程度上对格式不正确的HTML(“标签汤”)表示宽容和宽容,就像吉蒂, NekoHTML, 汤汤和HtmlCleaner..您通常使用这种HTML解析器来“整理”HTML源代码(例如,替换HTML-有效的)。
由xml-有效
),以便您可以使用W3CDOM和JAXPAPI来遍历它。

HtmlUnit

HtmlUnit提供一个完全属于自己的API,使您有可能以编程方式执行Web浏览器的操作。即。输入表单值,单击元素,调用JavaScript等等。它不仅仅是一个HTML解析器。这是一个真正的“GUI无浏览器”和HTML单元测试工具。

珍汤

珍汤还提供了一个完全自己的API。它使您可以使用jQuery-喜欢CSS选择器并提供一个灵活的API来遍历HTMLDOM树以获得感兴趣的元素。

特别是HTML DOM树的遍历是JSOUP的主要优势。曾经共事过的人org.w3c.dom.Document知道用冗长的文字遍历DOM是多么痛苦NodeList和NodeAPI。是真的,XPath使生活变得更容易,但是,这是另一个学习曲线,它可能最终仍然冗长。

下面是一个示例,它使用像JTidy这样的“普通”W3C DOM解析器和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 
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();System.out.println("Question: " + question.text());
Elements answerers = document.select("#answers .user-details a");for (Element answerer : answerers) {
System.out.println("Answerer: " + answerer.text());}

你看到区别了吗?它不仅代码较少,而且如果您已经对CSS选择器有了一定的经验(例如通过开发网站和/或使用jQuery),那么JSOUP也相对容易掌握。

摘要

现在,每一种方法的利弊都应该很清楚。如果您只想使用标准的JAXPAPI来遍历它,那么就选择第一个提到的解析器组。有漂亮的很多他们。选择哪一个取决于它提供的特性(HTML清理是如何使您轻松的?)是否存在一些侦听器/拦截器和特定于标记的清除程序?)以及库的健壮性(它多久更新一次/维护/修复?)。如果您喜欢单元测试HTML,那么HtmlUnit就是方法之一。如果您喜欢从HTML中提取特定的数据(这通常是现实世界中的需求),那么JSOUP就是最好的选择。