如何使用Java高效解析HTML?

209

我在工作中需要大量进行HTML解析。目前,我正在使用HtmlUnit无头浏览器进行解析和浏览器自动化。

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

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

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

  1. 速度
  2. 通过“id”、“名称”或“标记类型”轻松定位任何HtmlElement。

如果不清理脏的HTML代码,也可以接受。我不需要清理任何HTML源代码。我只需要一种最简单的方法来遍历HtmlElements并从中收集数据。


可能的缓慢原因是解析器从互联网下载DTD和/或XSD文件。 - Thorbjørn Ravn Andersen
3个回答

431

自我介绍一下:我刚发布了一个新的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();

查看Selector javadoc获取更多信息。

这是一个新项目,因此非常欢迎提出改进意见!


33
到目前为止,我见过的最好的HTML解析器是HtmlCleaner

HtmlCleaner是用Java编写的开源HTML解析器。在网络上找到的HTML通常是肮脏的、格式不正确的,不适合进一步处理。对于这些文档的任何重要使用,首先需要清理混乱并将标记、属性和普通文本排序。对于给定的HTML文档,HtmlCleaner重新排序各个元素,并生成格式良好的XML。默认情况下,它遵循大多数Web浏览器使用的类似规则,以创建文档对象模型。但是,用户可以提供自定义标签和规则集来进行标记过滤和平衡。

使用HtmlCleaner,您可以使用XPath定位任何元素。

有关其他HTML解析器,请参见此SO问题


2
你必须自己处理代理,然后使用HtmlCleaner来处理流。这不太方便。T__T - kidnan1991
HTMLTidy难道不是更好的选择吗?http://www.html-tidy.org/ - Troy Witthoeft
2
大多数Web浏览器使用类似的规则。- 这并不是非常有说服力。 - pguardiario

9

3
我尝试使用过这个,但发现非常难用。几乎没有文档或支持。 - Ryan Shillington

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接