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

标签 java html parsing

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

这是我看到的:

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

谢谢!

最佳答案

一般

几乎所有已知的 HTML 解析器都实现了 W3C DOM API (JAXP API 的一部分,用于 XML 处理的 Java API)并为您提供 org.w3c.dom.Document back 可供 JAXP API 直接使用。主要差异通常可以在所讨论的解析器的特性中找到。大多数解析器在一定程度上对非格式良好的 HTML(“tagsoup”)宽容和宽容,例如 JTidy , NekoHTML , TagSoupHtmlCleaner .您通常使用这种 HTML 解析器来“整理”HTML 源代码(例如,将 HTML 有效的 <br> 替换为 XML 有效的 <br /> ),以便您可以使用 W3C DOM 以“通常的方式”遍历它和 JAXP API。

唯一跳出来的是HtmlUnitJsoup .

HtmlUnit

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

Jsoup还提供了完全自己的API。它使您可以使用 jQuery 选择元素- 像 CSS selectors并提供了一个巧妙的 API 来遍历 HTML DOM 树以获取感兴趣的元素。

特别是HTML DOM树的遍历是Jsoup的主要优势。与 org.w3c.dom.Document 合作过的人知道使用详细的 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 来遍历它,那么请使用第一个提到的解析器组。有漂亮的a lot其中。选择哪一个取决于它提供的功能(HTML 清理如何让您轻松?是否有一些监听器/拦截器和特定于标签的清理器?)以及库的健壮性(更新/维护/修复的频率? )。如果您喜欢对 HTML 进行单元测试,那么 HtmlUnit 是您的最佳选择。如果您想从 HTML 中提取特定数据(这通常是现实世界的要求),那么 Jsoup 就是您的最佳选择。

关于java - 领先的 Java HTML 解析器的优缺点是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3152138/

相关文章:

java - 无法使用 java 将德语 'umlauts' (äöü) 从控制台写入文本文件

java - 以 JFrame 形式创建对象

html - 高度 100% 的 Fieldset child 太大了

javascript - html中的工具提示

python - 在 python : how to split newlines while ignoring newline inside quotes 中解析字符串

java - 解析 wsdl 时出错 - 系统找不到指定的路径

java - 尝试在 My HomeFragment 中实现 RecyclerView 时应用已停止

javascript - 在 Angular JS 中计算销售价格

ios - 使用 NSArray 从 iOS 上的可转换核心数据创建对象

c# - 正则表达式:解析街道名称/号码