当前位置: 首页 > 面试题库 >

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

王棋
2023-03-14
问题内容

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

这是我所看到的:

  • JTidy
  • NekoHTML
  • jsoup
  • TagSoup

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

谢谢!


问题答案:

General

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

唯一跳出来的是HtmlUnit和Jsoup。

HtmlUnit

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

Jsoup
Jsoup还提供了一个完全自己的API。它使你可以使用类似jQuery的CSS选择器来选择元素,并提供一个漂亮的API来遍历HTML DOM树以获得感兴趣的元素。

特别是遍历HTML DOM树是Jsoup的主要优势。与之共事的人org.w3c.dom.Document知道使用冗长的API NodeList和遍历DOM到底是多么痛苦Node。没错,这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());
}

这是一个如何使用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是你的最佳选择。



 类似资料:
  • 问题内容: 只是想知道TreeSet的优缺点是什么,是否有人可以告诉我?谢谢! 问题答案: 收藏类之一。它使您可以按键或按键顺序访问集合中的元素。它比ArrayList或HashMap具有更多的开销。当您不需要顺序访问时,只需按键查找即可使用HashSet。使用ArrayList并使用Arrays。如果只想按顺序排列元素,则排序。TreeSet始终保持元素顺序。使用ArrayList,您可以在需要

  • 问题内容: 我正在寻找提高某些SQL性能的方法,当前CTE正在脚本中多次使用和引用。我会使用表变量来获得改进吗?(因为代码在函数内,所以不能使用临时表)。 问题答案: 您实际上必须进行性能测试-没有“是/否”答案。根据安迪·利文(Andy Living)上面链接到的文章,CTE只是查询或子查询的简写。 如果您在同一函数中两次或多次调用它,则填充表变量然后加入该表变量或从中选择表变量可能会获得更好的

  • 问题内容: 我目前正在尝试创建一个数据库,其中很大一部分数据是临时的。在通读了许多技术后(大多数涉及6nf归一化),我遇到了Anchor Modeling 。 我正在开发的模式非常类似于Anchor Modeling模型,特别是因为用例(时间数据+未知未知数)是如此相似,以至于我很想完全拥抱它。 我遇到的两个最大问题是,我无法找到详细说明这种方法的负面影响,也找不到对我需要了解的将其用于生产战争故

  • 本文向大家介绍你觉得你的优点是什么,缺点又是什么呢相关面试题,主要包含被问及你觉得你的优点是什么,缺点又是什么呢时的应答技巧和注意事项,需要的朋友参考一下 优点:对任何事物能够保持好奇心、很强的执行力、追求上进。 缺点:有些事情考虑太多,总想找出最好的办法,所以有的时候会耽误进度。所以要学会抓住主要矛盾,学会取舍。

  • 本文向大家介绍索引的作用?和它的优点缺点是什么?相关面试题,主要包含被问及索引的作用?和它的优点缺点是什么?时的应答技巧和注意事项,需要的朋友参考一下 答:索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的,创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录入的速度,同时也增加了数据库的

  • 问题内容: 我正在寻找一个JavaScript库,该库将允许我使用类似LINQ的语法查询复杂的JSON对象。快速搜索发现了一些有希望的选择,它们看起来可能会满足我的需求: LINQ to JavaScript 和jLinq 有没有人有使用它们的经验? 有什么优点和缺点? 性能可比吗? LINQ to JavaScript的函数传递语法是否提供任何隐藏的好处(我个人发现jLinq的语法乍一看更具吸引