java中几种解析html的工具

html-css08

java中几种解析html的工具,第1张

HTML分析是一个比较复杂的工作,Java世界主要有几款比较方便的分析工具:

1.Jsoup 

Jsoup是一个集强大和便利于一体的HTML解析工具。它方便的地方是,可以用于支持用jQuery中css selector的方式选取元素,这对于熟悉js的开发者来说基本没有学习成本。

String content = "blabla"

Document doc = JSoup.parse(content)

Elements links = doc.select("a[href]")

Jsoup还支持白名单过滤机制,对于网站防止XSS攻击也是很好的。

2.HtmlParser

HtmlParser的功能比较完备,也挺灵活,但谈不上方便。这个项目很久没有维护了,最新版本是2.1。HtmlParser的核心元素是Node,对应一个HTML标签,支持getChildren()等树状遍历方式。HtmlParser另外一个核心元素是NodeFilter,通过实现NodeFilter接口,可以对页面元素进行筛选。这里有一篇HtmlParser的使用文章:使用 HttpClient 和 HtmlParser 实现简易爬虫。

3.Apache tika

tika是专为抽取而生的工具,还支持PDF、Zip甚至是Java Class。使用tika分析HTML,需要自己定义一个抽取内容的Handler并继承org.xml.sax.helpers.DefaultHandler,解析方式就是xml标准的方式。crawler4j中就使用了tika作为解析工具。SAX这种流式的解析方式对于分析大文件很有用,我个人倒是认为对于解析html意义不是很大。

InputStream inputStream = null

HtmlParser htmlParser = new HtmlParser()

htmlParser.parse(new ByteArrayInputStream(page.getContentData()),

contentHandler, metadata, new ParseContext())

4.HtmlCleaner与XPath

HtmlCleaner最大的优点是:支持XPath的方式选取元素。XPath是一门在XML中查找信息的语言,也可以用于抽取HTML元素。XPath与CSS Selector大部分功能都是重合的,但是CSS Selector专门针对HTML,写法更简洁,而XPath则是通用的标准,可以精确到属性值。XPath有一定的学习成本,但是对经常需要编写爬虫的人来说,这点投入绝对是值得的。

解析HTML最好的类还是微软自己的在站内搜索的项目要进行HTML的解析,发现程序运行非常慢,一开始以为是lucene的问题,一测试大吃一惊,每一步lucene中AddDocument等只用了几十毫秒,而HTML解析竟然用了9秒。日志如下:2010-06-26 15:51:25,171 [8] DEBUG SearchSite.StartIndex - DownloadString:00:00:00.04823292010-06-26 15:51:34,187 [8] DEBUG SearchSite.StartIndex - ThreadParser:00:00:09.02364902010-06-26 15:51:34,187 [8] DEBUG SearchSite.StartIndex - DeleteDocuments:00:00:00.00000692010-06-26 15:51:34,203 [8] DEBUG SearchSite.StartIndex - AddDocument:00:00:00.0191071我使用的是Winista.HtmlParser这块网上找到的HTML解析器。遂准备更换解析器,但是用“.Net HTML Parser”在google上寻找,一直没找到合适的解析器,不是太难用,就是性能比Winista.HtmlParser还差,我才想到,微软的MSHTML不就是用来解析HTML的吗?折腾这么一圈却忘了微软自家的东西,微软的东西性能肯定差不了。添加对Microsoft.mshtml这个程序集的引用,然后编写如下代码:IHTMLDocument2 doc = new HTMLDocumentClass() doc.write(new object[]{pageSource}) doc.close() Title = doc.title Body = doc.body.innerText再测试,哇咔咔,快的要命,只有几十毫秒,2000个帖子一会儿就爬完了。日志如下:2010-06-26 16:26:35,546 [8] DEBUG SearchSite.StartIndex - DownloadString:00:00:00.04002632010-06-26 16:26:35,562 [8] DEBUG SearchSite.StartIndex - ThreadParser:00:00:00.02577312010-06-26 16:26:35,562 [8] DEBUG SearchSite.StartIndex - DeleteDocuments:00:00:00.00019132010-06-26 16:26:35,578 [8] DEBUG SearchSite.StartIndex - AddDocument:00:00:00.0010881HTMLDocumentClass的方法比任何一个网上找到的HTML解析器都丰富,想怎么搞就怎么搞,而且调用方法就是操作Dom的方法,完全不用再去学,哇咔咔,爽呆了。在使用的过程中遇到两个问题:1、VS2010中引用Microsoft.mshtml之后,要修改这个引用的“嵌入互操作类型”为False。2、调用doc.write方法的时候必须通过IHTMLDocument2接口来调用,否则报错“错误的类型”,在google上搜“type mismatch HTMLDocument write”

java可以使用jsoup、htmlparser等工具进行html的读取和解析,以下是详细说明:

1、jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据。据说它是基于MIT协议发布的。

jsoup的主要功能如下:

从一个URL,文件或字符串中解析HTML;

使用DOM或CSS选择器来查找、取出数据;

可操作HTML元素、属性、文本;

示例代码:

Document doc = Jsoup.parse(input, "UTF-8", "http://www.dangdang.com")

Element content = doc.getElementById("content")

Elements links = content.getElementsByTag("a")

for (Element link : links) {

String linkHref = link.attr("href")

String linkText = link.text()

}

2、htmlparser是一个纯的java写的html解析的库,它不依赖于其它的java库文件,主要用于改造或提取html。它能超高速解析html,而且不会出错。现在htmlparser最新版本为2.0。 据说htmlparser就是目前最好的html解析和分析的工具。无论你是想抓取网页数据还是改造html的内容,用了htmlparser绝对会忍不住称赞。

在线文档: http://www.osctools.net/apidocs/apidoc?api=HTMLParser;http://htmlparser.sourceforge.net/project-info.html

示例代码:

Parser parser = new Parser ("http://www.dangdang.com")

NodeList list = parser.parse (null)

Node node = list.elementAt (0)

NodeList sublist = node.getChildren ()

System.out.println (sublist.size ())