Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
领先的Java HTML解析器的优缺点是什么?_Java_Html_Parsing - Fatal编程技术网

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

领先的Java HTML解析器的优缺点是什么?,java,html,parsing,Java,Html,Parsing,在搜索SO和Google时,我发现有一些Java HTML解析器是各方一致推荐的。不幸的是,很难找到关于各种图书馆的优势和劣势的任何信息。我希望有些人花了一些时间比较这些图书馆,并能分享他们学到的东西 以下是我所看到的: 如果我错过了一个主要的解析器,我也想听听它的优缺点 谢谢 将HTML 5解析算法的Java实现添加到您的列表中 另一方面,它是专门为匹配HTML5而设计的,并且是HTML5验证程序的核心,因此很可能以非常高的精度匹配未来浏览器的解析行为 不利的一面是,没有浏览器的遗

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

以下是我所看到的:

如果我错过了一个主要的解析器,我也想听听它的优缺点

谢谢

将HTML 5解析算法的Java实现添加到您的列表中

另一方面,它是专门为匹配HTML5而设计的,并且是HTML5验证程序的核心,因此很可能以非常高的精度匹配未来浏览器的解析行为

不利的一面是,没有浏览器的遗留解析是这样工作的,因为HTML5仍处于起草阶段,可能会发生变化

实际上,这样的问题只会影响模糊的角落情况,对于所有实际用途来说,它都是一个优秀的解析器。

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

  • 内科特米尔
  • 吉蒂德
  • 塔格汤
  • HtmlCleaner
这绝不是一个完整的总结,而是2008年的总结。但您可能会发现它很有用。

我发现HTML解析器编写得非常好,保持最新(许多解析器都不是),没有依赖性,并且易于使用。

概述 几乎所有已知的HTML解析器都实现了(jaxpapi的一部分,用于XML处理的javaapi),并为您提供了一个back,供jaxpapi直接使用。主要的区别通常可以在所讨论的解析器的特性中找到。大多数解析器在某种程度上对非良好格式的HTML(“tagsoup”)宽容宽容,比如,和。您通常使用这种HTML解析器来“整理”HTML源代码(例如,将HTML有效的

替换为XML有效的

),以便您可以使用W3C DOM和JAXP API“常规方式”遍历它

唯一跳出来的是和

HtmlUnit 提供一个完全自己的API,使您能够以编程方式像webbrowser一样工作。例如,输入表单值、单击元素、调用JavaScript等等。它不仅仅是一个HTML解析器。它是一个真正的“无GUI的webbrowser”和HTML单元测试工具

大杀器 还提供了一个完全自己的API。它提供了使用like选择元素的可能性,并提供了一个灵活的API来遍历HTMLDOM树以获取感兴趣的元素

特别是HTML DOM树的遍历是Jsoup的主要优势。使用过
org.w3c.dom.Document
的人都知道使用verbose和api遍历dom是多么痛苦。的确,这让生活变得更轻松,但这仍然是另一条学习曲线,最终可能会变得冗长

这里有一个例子,它使用一个“普通”的W3CDOM解析器,比如JTidy,结合XPath来提取问题的第一段和所有回答者的名字(我使用XPath,因为如果没有它,收集感兴趣的信息所需的代码将增长10倍,而不编写实用程序/助手方法)

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

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

在使用Java中的大多数HTML解析库之后,我将添加到@MJB answer中,有一个巨大的优点/缺点被忽略了:解析器可以在输入和输出时保留HTML的格式和不正确性

也就是说,当您更改文档时,大多数解析器都会清除DOM中的空白、注释和不正确性,特别是如果它们是类似XML的库的话

是我所知道的唯一一个解析器,它允许您在保留空白格式和HTML的不正确性(如果有)的同时操作讨厌的HTML。

另外两个选项是和

我已经尝试了这里的大多数解析器,以获得我一直在开发的爬虫/数据提取框架。我使用HTMLCleaner进行大部分数据提取工作。这是因为它支持一种相当现代的HTML、XHTML、HTML5方言和名称空间,并且它支持DOM,因此可以使用

使用HTMLCleaner要比使用其他解析器容易得多:例如,JSoup支持类似DOM的接口,而不是DOM,因此需要一些程序集。Jericho有一个SAX行接口,所以它同样需要一些工作,尽管最终HTMLCleaner工作得更好

我还使用HTMLParser和Jericho进行表提取任务,这取代了一些使用Perl编写的代码。我使用HTMLParser为表过滤HTML,然后使用Jericho解析它。我同意MJB和Adam的评论,Jericho在某些情况下是好的,因为它保留了底层HTML。它有一种非标准的SAX接口,因此对于XPath处理,HTMLCleaner更好

在Java中解析HTML是一个令人惊讶的难题,因为所有的解析器似乎都在处理某些格式错误的HTML内容。

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());
}
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());
}