My studying notes for Java,Ruby,Ajax and other any interesting things.

星期六, 十一月 04, 2006

HTML解析器

一段时间makefire一直在和我讨论关于html解析的话题,但是一直没有怎么用心去看看有没有三方的开源项目可以实现.窃以为就和xml解析的过程差不多,但是可能会灵活一些,毕竟html的语法不如xml那么强制规范,所以遇到不规范的书写就不知道该怎么解析了.

今天在google和sourceforge.net上面找了找,发现有人确实有心,做了一个html parser的开源项目,jericho-html而且已经到了1.5版本了,看样子也应该比较成熟了,于是下载看看能否适应我的需求.发现一共只有50个类左右(大部分都是数据bean,比如emlment,tag之类的),不依赖于其他三方的lib,所以可以直接就使用了.看了一下使用的sample:

import au.id.jericho.lib.html.*;
import java.util.*;
import java.io.*;
import java.net.*;
 
public class DisplayAllElements {
public static void main(String[] args) throws Exception {
String sourceUrlString="data/test.html" ;
if (args.length==0)
  System.err.println("Using default argument of \""+sourceUrlString+'"');
else
sourceUrlString=args[0];
if (sourceUrlString.indexOf(':')==-1) sourceUrlString="file:"+sourceUrlString;
URL sourceUrl=new URL(sourceUrlString);
String htmlText=Util.getString(new InputStreamReader(sourceUrl.openStream()));
Source source= new Source(htmlText);
source.setLogWriter(new OutputStreamWriter(System.err));
                  // send log messages to stderr
for (Iterator i=source.findAllElements().iterator(); i.hasNext(); )
 
{
Element element=(Element)i.next();
 
System.out.println("---------------------------------"
                                 +"----------------------------------------------");
System.out.println(element.getDebugInfo());
System.out.println(element);
}
  }
}

有一个Util类从给如的uri中得出所有的htmlstr,然后再对这个str转换成为一个html的source,source可以设置logwriter,这样子一来就可以注入log4j的工具和其结合起来,如果放到一个aop的框架里面也会和其他的lib造成依赖和耦合关系.Tag类中静态定义了一大批的字符串变量,代表各种html的标签,而source中有方法遍历(iterate)和查找(findAllStartTags),找到则可以显示其内容和属性.

同时这个项目还提供了对jsp,asp,php等脚本语言的支持,可以对jsp或者php的源码进行分析.项目的实际意义可以在于网页搜索工具,比如做一个baidu或者google类似的搜索工具,只需要对我库中已经注册过的网站(url)定点的进行页面分析,分析关键字并且存在数据库中,则搜索的速度可以大大提高.

不知道google的实现方式是文本搜索,全文索引还是其他方式?



--
----------------------------------

   你的支持 我的坚持
  Lead to The IT Future

----------------------------------

没有评论: