介绍
今天给大家推荐一款最好的网页解析类库—HtmlCleaner。至少是目前为止最好的Java解析库。
与HtmlCleaner结缘是在年初的时候,因为一项工作需要解析Html页面,所以我在网上遍寻Html解析库。
网上口碑极佳的是HTML Parser这个库,我试了一下,速度极慢,处理一个比较大的网页需要几百毫秒,更要命的是,有些网页解析不了!
经过千辛万苦,我终于找到了籍籍无名的HtmlCleanner。一见之下,惊为天人!
HtmlCleaner极其短小精悍,源码一共只有260KB,并且速度惊人,只需要10毫秒左右就可以处理完HtmlParser需要300毫秒处理的Html页面。
而且,根据我对网上随机的网页进行的测试,没有一个对付不了的。
打开HtmlCleaner的javadoc,常常的一串接口和类。别怕,那些都不用您操心。我们只需要关心HtmlCleaner这个类就可以了。
HtmlCleaner库的使用极其简便,只需要调用HtmlCleaner类的几个方法即可。
典型的使用过程如下:
HtmlCleaner cleaner = new HtmlCleaner(...); // one of few constructors
cleaner.setXXX(...) // optionally, set cleaner's behaviour
clener.clean(); // calls cleaning process
clean方法就完成了对Html页面的解析。
cleaner.writeXmlXXX(...); // writes resulting XML to string, file or any output stream
// cleaner.createDOM(); // creates DOM of resulting xml
DomSerializer类的实例的createDOM方法可以返回org.w3c.dom.Document对象。不错,这就是Java标准的xml文档的表示。然后,你就可以使用任何第三方库来处理xml文档了。
// cleaner.createJDom(); // creates JDom of resulting xml
你也可以生成JDom对象,用JDom处理。
下面是我用HtmlCleaner写的一个方法
public Document convertHtmlToXML(URL url){
// create an instance of HtmlCleaner
HtmlCleaner cleaner = new HtmlCleaner();
// take default cleaner properties
CleanerProperties props = cleaner.getProperties();
TagNode tagNode=null;
Document document=null;
try {
tagNode = cleaner.clean(url);
document= new DomSerializer(props, true).createDOM(tagNode);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return document;
}
得到Document之后,可以使用dom4j等xml处理库进行处理。
查看HtmlCleanner的源码可以看到,HtmlCleanner的设计思想非常简单,就是使用正则表达式解析Html页面。
而它的数据容器类TagNode也和我设计OXmlEd库的想法类似。也是简单的把XML当做一个树的结构。不过TagNode类要比我的INode接口复杂一些,多了不少东东。我的INode接口内容很少,因为我不关心注释。
我的OXmlEd后来根据HtmlCleaner做了更新,这样,您可以使用OXmlEd库来直接操纵HtmlCleaner解析的Html页面的内容了。但最近很忙,一直没有整理,过几天再上传OXmlEd的新版本吧。OXmlEd库的介绍在
http://blog.csdn.net/shendl/archive/2007/08/23/1755218.aspx
Host站点在:http://sourceforge.net/projects/oxmled/
HtmlCleanner库写得非常好,由此可见,一个好的设计思想胜过一切。开源库中良莠不齐,这很正常,HtmlCleaner是我寻获的一把利器,现在转送给诸君。