领先的Java HTML解析器的优点和缺点是什么?

问题:

搜索SO和Google,我发现有几个Java HTML解析器,各方一直推荐。不幸的是,很难找到关于各种图书馆优势和弱点的信息。我希望有些人花了一些比较这些图书馆,并可以分享他们所学到的东西。
这是我看到的:

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

回答:

一般

几乎所有已知的HTML解析器都实现了W3C DOM API(JAXP API的一部分,用于XML处理的Java API),并为您提供了一个可以由JAXP API直接使用的org.w3c.dom.Document。主要的区别通常在于解析器的特征。大多数解析器在JTidyNekoHTMLTagSoupHtmlCleaner之间具有一定程度的宽容和宽广的非格式化HTML(“tagsoup”)。您通常使用这种HTML解析器来“整理”HTML源代码(例如,通过XML有效的<br />替换HTML有效的<br>),以便您可以使用W3C DOM“通常的方式”遍历和JAXP API。
唯一跳出的是HtmlUnitJsoup

的HtmlUnit

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

Jsoup

 Jsoup还提供了一个完全自己的API。它使您可以使用jQueryCSS selectors选择元素,并提供一个光滑的API来遍历HTML DOM树以获取感兴趣的元素。
特别是遍历HTML DOM树是Jsoup的主要优势。与org.w3c.dom.Document合作的人知道使用详细的NodeListNode API来遍历DOM是什么痛苦的。诚然,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 < answerers.getLength(); i++) { System.out.println("Answerer: " + answerers.item(i).getFirstChild().getNodeValue()); } [/code] 这里是一个例子,如何与Jsoup完全相同: [code lang="python"] 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()); } [/code] 你看到差异吗它不仅代码少,而且如果您已经对CSS选择器(例如开发网站和/或使用jQuery)有过适度的经验,Jsoup也会比较容易掌握。

概要

每个人的利弊现在应该足够清楚。如果您只想使用标准的JAXP API来遍历它,那么请转到第一组解析器。其中有很多a lot。选择哪一个取决于它提供的功能(HTML清洁对于您来说容易如何?有些听众/拦截器和特定于标签的清除程序?)和库的鲁棒性(更新/维护/修复的频率) )。如果你喜欢单元测试HTML,那么HtmlUnit就是要走的路。如果你想从HTML中提取特定的数据(这超出了现实世界的要求),那么Jsoup就是要走的路。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: What are the pros and cons of the leading Java HTML parsers?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

22 + = 25