领先的Java HTML解析器的优缺点是什么?[已关闭]

2022-08-31 06:50:36

搜索SO和Google,我发现有一些Java HTML解析器一直被各方推荐。不幸的是,很难找到有关各种库的优势和劣势的任何信息。我希望有些人花了一些时间来比较这些库,并可以分享他们所学到的东西。

以下是我所看到的:

如果有一个主要的解析器我错过了,我也很乐意听听它的优缺点。

谢谢!


答案 1

常规

几乎所有已知的HTML解析器都实现了W3C DOM API(JAXP API的一部分,Java API用于XML处理),并为您提供了一个org.w3c.dom.Document,该文档可供JAXP API直接使用。主要区别通常在于所讨论的解析器的功能。大多数解析器在某种程度上对非格式良好的HTML(“tagsoup”)持宽容和宽容态度,如JTidyNekoHTMLTagSoupHtmlCleaner。您通常使用这种HTML解析器来“整理”HTML源代码(例如,用XML valid替换HTML-valid),以便您可以使用W3C DOM和JAXP API“以通常的方式”遍历它。<br><br />

唯一跳出来的是HtmlUnitJsoup

HtmlUnit

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

Jsoup

Jsoup还提供了一个完全自己的API。它使您可以使用类似jQueryCSS选择器来选择元素,并提供一个光滑的API来遍历HTML DOM树以获取感兴趣的元素。

特别是HTML DOM树的遍历是Jsoup的主要优势。那些曾经合作过的人都知道,使用冗长的NodeList和Node API遍历DOM是多么痛苦。没错,XPath使生活更轻松,但仍然是另一条学习曲线,它最终可能仍然冗长。org.w3c.dom.Document

这里有一个例子,它使用像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 < 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();
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也相对容易掌握。

总结

现在,每种方法的优缺点应该足够清楚了。如果您只想使用标准的 JAXP API 来遍历它,那么请选择前面提到的第一组解析器。有很多。选择哪一个取决于它提供的功能(HTML清理如何变得容易?是否有一些侦听器/拦截器和特定于标签的清理程序?)和库的健壮性(它多久更新一次/维护/修复?)。如果你喜欢对HTML进行单元测试,那么HtmlUnit就是你要走的路。如果你想从HTML中提取特定的数据(这通常是现实世界的要求),那么Jsoup就是你要走的路。


答案 2

本文比较了以下解析器的某些方面:

  • NekoHTML
  • 杰蒂迪
  • TagSoup
  • HtmlCleaner

它绝不是一个完整的摘要,它是从2008年开始的。但你可能会发现它很有帮助。