HTMLParser的visitor访问方式详解

来源:互联网 发布:pon网络由什么组成 编辑:程序博客网 时间:2024/05/17 05:06

参考文档:http://allenj2ee.iteye.com/blog/222457 ,希望与大家分享

从简单方面的理解,Filter是根据某种条件过滤取出需要的Node再进行处理。Visitor则是遍历内容树的每一个节点,对于符合条件的节点进行处理

。实际的结果异曲同工,两种不同的方法可以达到相同的结果:
1、
package html;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import org.htmlparser.Parser;
import org.htmlparser.Remark;
import org.htmlparser.Tag;
import org.htmlparser.Text;
import org.htmlparser.util.ParserException;
import org.htmlparser.visitors.NodeVisitor;

public class TestVisitor {

 public static void testVisitor (String url){
  try {
   //==============连接方法一 ==================
   URL l_url = new java.net.URL(url);
   HttpURLConnection l_connection =(HttpURLConnection) l_url.openConnection();
   //通过指定URLConnection对象创建Parser对象
   Parser parser = new Parser(l_connection);
   
   //==============连接方法二 ==================
   //建立连接
//   HttpURLConnection l_connection =(HttpURLConnection) l_url.openConnection();
   //通过指定URLConnection对象创建Parser对象
//   Parser parser = new Parser();
//   parser.setURL(url);
   
   parser.setEncoding(parser.getEncoding());
   NodeVisitor visitor = new NodeVisitor (true, false){
    public void visitTag(Tag tag){
     System.out.println("tagname="+tag.getTagName()+"--text="+tag.getText()+"--

class="+tag.getPage());
    }
    public void visitStringNode (Text string)    {
     System.out.println("This is Text:"+string);
                }
                public void visitRemarkNode (Remark remark)  {
                 System.out.println("This is Remark:"+remark.getText());
                }
                public void beginParsing () {
                 System.out.println("beginParsing");
                }
                public void visitEndTag (Tag tag){
                 System.out.println("visitEndTag:"+tag.getText());
                }
                public void finishedParsing () {
                 System.out.println("finishedParsing");
                }
   };
   parser.visitAllNodesWith(visitor);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
 public static void main(String[] args) {
  testVisitor("http://www.hao123.com/");
 }
}
2、可以看到,开始遍历所以的节点以前,beginParsing先被调用,然后处理的是中间的Node,最后在结束遍历以前,finishParsing被调用。因为我

设置的 recurseChildren和recurseSelf都是false,所以Visitor没有访问子节点也没有访问根节点的内容。

3、先把recurseSelf设置成true,看看会发生什么。
NodeVisitor visitor = new NodeVisitor( false, true) {
可以看到,HTML页面的第一层节点都被调用了。

4、我们再用下面的方法调用看看:
NodeVisitor visitor = new NodeVisitor( true, false)
可以看到,所有的子节点都出现了,除了刚刚例子里面的两个最上层节点This is Tag:head和This is Tag:html
想让它们都出来,只需要
NodeVisitor visitor = new NodeVisitor( true, true) {

 

原创粉丝点击