博客园  :: 联系 :: 管理

【转】HTMLPARSER学习小结

Posted on 2010-10-22 16:27  独孤雁  阅读(247)  评论(0编辑  收藏  举报

htmlparser是个优秀的网页信息抓取工具,下面小结其一些基本的用法:

 

1 创建parser对象,有两种方式
  Parser parser=new Parser(String html)
  传入的html
  第2种为:
   //通过指定URLConnection对象创建Parser对象
  Parser parser = new Parser((HttpURLConnection)(new URL(url)).openConnection());
之后就可以进行访问parser中解析好的内容了
2 解析时,有两类方式,visitor方式和filter过滤方式,vistior方式需要遍历每一个节点,
而filter方式则是过滤。

3 visitor方式的例子;
   try{
//通过指定URLConnection对象创建Parser对象
Parser parser = new Parser((HttpURLConnection)(new URL(url)).openConnection());
//设置Parser对象的字符编码,一般与网页的字符编码保持一致
        parser.setEncoding("GB2312");
        //创建LinkFindingVisitor对象
        LinkFindingVisitor lvisitor = new LinkFindingVisitor("http://news.qq.com/");
        //查找http://www.qq.com的链接个数
        parser.visitAllNodesWith(lvisitor);
        System.out.println("网页中包含http://news.qq.com/的链接个数:"+lvisitor.getCount());
}catch(Exception ex){
ex.printStackTrace();
}

      /** TextExtractingVisitor类的用法举例 */
public static void testTextExtractingVisitor(String url){
try{
//通过指定URLConnection对象创建Parser对象
Parser parser = new Parser((HttpURLConnection)(new URL(url)).openConnection());
//设置Parser对象的字符编码,一般与网页的字符编码保持一致
        parser.setEncoding("GB2312");
        //创建StringFindingVisitor对象
        TextExtractingVisitor visitor = new TextExtractingVisitor();
        //去除网页中的所有标签,提出纯文本内容
        parser.visitAllNodesWith(visitor);
        System.out.println("网页的纯文本内容为:"+visitor.getExtractedText());
}catch(Exception ex){
ex.printStackTrace();
}
}

 

4 还可以自定义nodevisitor来扩展nodevisitor,重载其中的各方法:
  /** 自定义NodeVisitor子类,并重载抽象类NodeVisitor中的相关方法 */
public class MyNodeVisitor extends NodeVisitor {

/** 重载抽象类NodeVisitor的beginParsing方法,解析开始时调用此方法 */
public void beginParsing(){
System.out.println("开始解析HTML内容......");
}

/** 重载抽象类NodeVisitor的finishedParsing方法,解析结束时调用此方法 */
public void finishedParsing(){
System.out.println("整个HTML内容解析完毕!");
}

/** 重载抽象类NodeVisitor的visitTag方法,遇到开始标签时调用此方法 */
public void visitTag(Tag tag){
System.out.println("开始当前标签: "+tag.getText());
}

/** 重载抽象类NodeVisitor的visitEndTag方法,遇到结束标签时调用此方法 */
public void visitEndTag(Tag tag){
System.out.println("结束当前标签: "+tag.getText());
}

/** 重载抽象类NodeVisitor的visitStringNode方法,遇到文本节点时调用此方法 */
public void visitStringNode(Text string){
System.out.println("当前文本节点: "+string);
}

/** 重载抽象类NodeVisitor的visitRemarkNode方法,遇到注释时调用此方法 */
public void visitRemarkNode(Remark remark){
System.out.println("当前注释: "+remark);
}

5 使用filter方式过滤
  基本用法:
   TagNameFilter类用法
   //通过指定URLConnection对象创建Parser对象
Parser parser = new Parser((HttpURLConnection)(new URL(url)).openConnection());
        //设置Parser对象的字符编码,一般与网页的字符编码保持一致
parser.setEncoding("GB2312");
            //创建TagNameFilter实例
            NodeFilter filter = new TagNameFilter ("DIV");
            //筛选出所有DIV标签节点
            NodeList nodes = parser.extractAllNodesThatMatch(filter);
            if(nodes!=null) {
                for (int i = 0; i < nodes.size(); i++) {
                    Node textnode = (Node) nodes.elementAt(i);                   
                    System.out.println("当前DIV:"+textnode.getText());
                }

   AndFilter类用法
    //通过指定URLConnection对象创建Parser对象
Parser parser = new Parser((HttpURLConnection)(new URL(url)).openConnection());
        //设置Parser对象的字符编码,一般与网页的字符编码保持一致
parser.setEncoding("GB2312");
            //创建HasAttributeFilter实例
        NodeFilter filter1 = new HasAttributeFilter("id");
        //创建TagNameFilter实例
        NodeFilter innerFilter = new TagNameFilter ("DIV");
        //创建HasChildFilter实例
        NodeFilter filter2 = new HasChildFilter(innerFilter);
        //创建AndFilter实例
        NodeFilter filter = new AndFilter(filter1, filter2);
        //筛选出所有具有id属性且拥有子节点的所有DIV节点
        NodeList nodes = parser.extractAllNodesThatMatch(filter);
            if(nodes!=null) {
                for (int i = 0; i < nodes.size(); i++) {
                    Node textnode = (Node) nodes.elementAt(i);                   
                    System.out.println("当前DIV:"+textnode.getText());
                }
            }      
StringFilter类用法:
  //通过指定URLConnection对象创建Parser对象
Parser parser = new Parser((HttpURLConnection)(new URL(url)).openConnection());
        //设置Parser对象的字符编码,一般与网页的字符编码保持一致
parser.setEncoding("GB2312");
//创建StringFilter实例
        NodeFilter filter = new StringFilter("陈水扁");
        //筛选出所有包含"陈水扁"字符串的所有文本节点
        NodeList nodes = parser.extractAllNodesThatMatch(filter);
            if(nodes!=null) {
                for (int i = 0; i < nodes.size(); i++) {
                    Node textnode = (Node) nodes.elementAt(i);                   
                    System.out.println("包含\"陈水扁\"字符串的文本节点:"+textnode.getText());
                }
            }