如何使用 Java 有效地解析 HTML?

How can I efficiently parse HTML with Java?

提问人:Amit 提问时间:1/31/2010 最后编辑:MachavityAmit 更新时间:12/8/2021 访问量:211459

问:

我在工作中做了很多 HTML 解析。到目前为止,我一直在使用 HtmlUnit 无头浏览器进行解析和浏览器自动化。

现在,我想将这两个任务分开。

我想使用一个轻量级的 HTML 解析器,因为在 HtmlUnit 中首先加载页面,然后获取源代码,然后解析它需要很多时间。

我想知道哪个 HTML 解析器可以有效地解析 HTML。我需要

  1. 速度
  2. 轻松通过其“id”或“name”或“tag type”找到任何HtmlElement。

如果它不清理肮脏的 HTML 代码,对我来说没关系。我不需要清理任何 HTML 源代码。我只需要一种最简单的方法来在 HtmlElements 之间移动并从中收集数据。

Java HTML 解析 网页抓取

评论

0赞 Thorbjørn Ravn Andersen 10/1/2015
如果解析器从 Internet 上下载 DTD 和/或 XSD,则速度可能会变慢。

答:

33赞 tangens 1/31/2010 #1

到目前为止,我见过的最好的是 HtmlCleaner

HtmlCleaner 是用 Java 编写的开源 HTML 解析器。在 Web 上找到的 HTML 通常是脏的、格式不正确的,不适合进一步处理。对于此类文档的任何严重消费,有必要首先清理烂摊子,并将订单带到标签、属性和普通文本中。对于给定的 HTML 文档,HtmlCleaner 对单个元素进行重新排序并生成格式正确的 XML。默认情况下,它遵循大多数 Web 浏览器用于创建文档对象模型的类似规则。但是,用户可以提供自定义标签和规则集,用于标签过滤和平衡。

使用 HtmlCleaner,您可以使用 XPath 找到任何元素。

对于其他 html 解析器,请参阅此 SO 问题

评论

2赞 kidnan1991 10/4/2016
您必须自己处理代理,然后使用 HtmlCleaner 来处理您的流。=> 不方便。T__T
0赞 Troy Witthoeft 10/25/2016
HTMLTidy在这里不是更好的选择吗?html-tidy.org
2赞 pguardiario 7/5/2017
Similar rules that the most of web browsers use- 这不是很有说服力
9赞 Ms2ger 1/31/2010 #2

我建议使用 Validator.nu 的解析器,它基于 HTML5 解析算法。它是 2010-05-03 在 Mozilla 中使用的解析器

评论

3赞 Ryan Shillington 1/4/2014
我试了一下,发现它超级难用。很少的文档/支持。
431赞 Jonathan Hedley 1/31/2010 #3

自插:我刚刚发布了一个新的Java HTML解析器:jsoup。我在这里提到它,因为我认为它会做你所追求的。

它的派对技巧是用于查找元素的 CSS 选择器语法,例如:

String html = "<html><head><title>First parse</title></head>"
  + "<body><p>Parsed HTML into a doc.</p></body></html>";
Document doc = Jsoup.parse(html);
Elements links = doc.select("a");
Element head = doc.select("head").first();

有关详细信息,请参阅选择器 javadoc。

这是一个新项目,因此非常欢迎任何改进的想法!