了解HttpParser

 这两天准备作一些网站编程的工做,因而对HtmlParse小研究了一下,目的是快速入手,而不是深刻研究,作了一下整理,和你们共同讨论一下。html

 
一,数据组织分析:
HtmlParser主要靠Node、AbstractNode和Tag来表达Html,由于Remark和Text相对简单,此处就将其忽略了。
 
Node是造成树结构表示HTML的基础,全部的数据表示都是接口Node的实现,Node定义了与页面树结构所表达的页面Page对象,定义了获取父、子、兄弟节点的方法,定义了节点到对应html文本的方法,定义了该节点对应的起止位置,定义了过滤方法,定义了Visitor访问机制。 
AbstractNode是Node的一种具体的类实现,起到构成树形结构的做用,除了同具体Node相关的accetp方法,toString,toHtml,toPlainTextString方法之外,AbstractNode实现了大多基本的方法,使得它的子类,不用理会具体的树操做。 
Tag是具体分析的主要内容。Tag分红composite的Tag和不能包含其余Tag的简单Tag两类,其中前者的基类是CompositeTag,其子类包含BodyTag,Div,FrameSetTag,OptionTag,等27个子类;而简单Tag有BaseHrefTag、DoctypeTag,FrameTag,ImageTag,InputTag,JspTag,MetaTag,ProcessingInstructionTag这八类。 
Node分红三类:
 
RemarkNode:表明Html中的注释 
TagNode:标签节点,是种类最多的节点类型,上述Tag的具体节点类都是TagNode的实现。 
TextNode:文本节点 
 
二,Visitor方式访问Html:
 
1,总体解析过程
用一个URL或页面String作一个Parser 
用这个Parser作一个Visitor 
使用Parser.visitAllNodeWith(Visitor)来遍历节点 
获取Visitor遍历后获得的数据 
2,Visit过程
作解析以前作的事情:visitor.beginParsing(); 
每次取到一个节点Node,让该Node接受accept该Visitor 
作解析后作的事情:visitor.finishedParsing(); 
3,获取节点的过程:逐步遍历Html,分析出Node。此部分较为复杂,且对于咱们应用来讲无需不少了解,暂跳过。
 
4,节点访问
节点访问采用Visitor模式,Node的accept方法和具体Visitor的visit方法是关键。
首先三类Node来accept的方式各不相同:
对于全部TagNode都使用一个accept方法,即TagNode的accept方法。首先判断是不是标签结尾,若是是就visitor.visitEndTag (this);不然visitor.visitTag (this); 
若是是TextNode,那就visitor.visitStringNode (this);就能够了。 
若是是RemarkNode,那就visitor.visitRemarkNode (this);就能够了。 
 
实际上NodeVisitor里边这四种visit方法都是空的,由于在不一样的Visitor中对于这三类节点的处理是不一样的;对于须要处理的节点,只要重载对应的visit方法就好了,若是不处理那就不理会就能够了;另外,若是用户用本身的Visitor,那么还能够灵活的处理不一样类型的节点了。
 
系统为咱们实现了下面我要介绍的8种Visitor,实际上能够看做是系统给咱们演示了如何作各类各样的Visitor来访问Html,由于实际上咱们要真正来用HtmlParser的话,还须要特定的Visitor,而经过简单的这些系统提供的Visitor组合是难以作成什么事情的。
 
三,系统Visitor功能简介:
ObjectFindingVisitor:用来找出全部指定类型的节点,采用getTags()来获取结果。 
StringBean:用来从一个指定的URL获取移除了<SCRIPT></SCRIPT>和<PRE></PRE>之间代码的Html代码,也能够用作Visitor,用来移除这两种标签内部的代码,采用StringBean.getStrings()来获取结果。 
HtmlPage:提取Title,body中的节点和页面中的TableTag节点。 
LinkFindingVisitor:找出节点中包含某个连接的总个数。 
StringFindingVisitor:找出遍历的TextNode中含有指定字符串的个数。 
TagFindingVisitor:找出指定Tag的全部节点,能够指定多种类型。 
TextExtractingVisitor:从网页中把全部标签去掉来提取文本,这个提取文本的Visitor有时是很实用的,只是注意在提取文本时将标签的属性也去掉了,也就是说只剩下标签之间的文本,例如<a>中的连接也去掉了。 
UrlModifyingVisitor:用来修改网页中的连接。 
四,Filter
 
若是说visitor是遍历提取信息,固然这个信息能够包括某些节点或者从节点分析出来的更有效的信息,这都取决于咱们的Visitor作成什么样子,那么Filter则目标很明确,就是用来提取节点的。因此说要想用HtmlParser,首先要熟悉上面讲到的数据组织。
 
系统定义了17种具体的Filter,包括依据节点父子关系的Filter,链接Filter组合的Filter,依据网页内容匹配状况的filter,等等。咱们也能够implement Filter来作本身的Filter来提取节点。
 
Filter的调用是同Visitor独立的,由于也无需先filter出一些NodeList,再用Visitor来访问。调用Filter的方法是:
NodeList nodeList = myParser.parse(someFilter);
解析以后,咱们能够采用:
Node[] nodes = nodeList.toNodeArray();
来获取节点数组,也能够直接访问:
Node node = nodeList.elementAt(i)来获取Node。
 
另外,在Filter后获得NodeList之后,咱们仍然可使用NodeList的extractAllNodesThatMatch(someFilter)来进一步过滤,同时又能够用NodeList的isitAllNodesWith(someVisitor)来作进一步的访问。
这样,咱们能够看到HtmlParser为咱们提供了很是方便的Html解析方式,针对不一样的应用能够采用visitor来遍历Html节点提取数据,也能够用Filter来过滤节点,提取出咱们所关注的节点,再对节点进行处理。经过这样的组合,必定可以找出咱们所须要的信息。
 
参考:
http://htmlparser.sourceforge.net/ 
http://www.blogjava.net/rocky/archive/2005/12/21/24997.aspx 
http://www.westing.cn/xblog/?p=90 
 
From: http://www.blogjava.net/lostfire/archive/2006/07/02/56212.html
相关文章
相关标签/搜索