zoukankan      html  css  js  c++  java
  • 【转】HTMLPARSER学习小结

    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());
                    }
                }    

  • 相关阅读:
    DHTML【11】--DOM
    sql 查询强制使用HASH连接性能测试比较
    Winform开发框架之读卡器和条码扫描枪的数据接收处理
    DevExpress的XtraReport和微软RDLC报表的使用和对比
    sql server日期时间转字符串
    C#在线更新程序[下载程序、解压缩程序、控制台程序]
    C# 定时器事件(设置时间间隔,间歇性执行某一函数,控制台程序)
    用C#用C#实现窗体在规定时间弹出,例如:10:00.弹出后关闭。并在5分钟后再次弹出。5次后停止。最好有具体代码实现窗体在规定时间弹出,例如:10:00.弹出后关闭。并在5分钟后再次弹出。5次后停止。最好有具体代码
    C#多线程学习之(五)使用定时器进行多线程的自动管理
    C# 文件与目录的基本操作(System.IO)
  • 原文地址:https://www.cnblogs.com/5tao/p/1858428.html
Copyright © 2011-2022 走看看