zoukankan      html  css  js  c++  java
  • HtmlParser应用,使用Filter从爬取到的网页中获取需要的内容

    htmlparser是一个纯的java写的html解析的库,它不依赖于其它的java库文件,主要用于改造或提取html。它能超高速解析html,而且不会出错。现在htmlparser最新版本为2.0

    下载地址http://sourceforge.net/projects/htmlparser/ 

    在线APIhttp://www.ostools.net/apidocs/apidoc?api=HTMLParser

    Filter就是对于结果进行过滤,取得需要的内容。HTMLParserorg.htmlparser.filters包之内一共定义了15个不同的Filter

    AndFilter、CssSelectorNodeFilter、HasAttributeFilter、HasChildFilter、HasSiblingFilter、IsEqualFilter、LinkRegexFilter、LinkStringFilter、NodeClassFilter、NotFilter、OrFilter、RegexFilter、StringFilter 、TagNameFilter.

    常用的几个过滤器说明 

    TagNameFilter:   
    是最容易理解的一个Filter,根据Tag的名字进行过滤

    HasChildFilter: 
    是返回有符合条件的子节点的节点,需要另外一个Filter作为过滤子节点的参数。

    HasAttributeFilter:
    可以匹配出包含制定名字的属性,或者制定属性为指定值的节点。HasParentFilter和HasSiblingFilter的功能与HasChildFilter类似。

    StringFilter:    
    这个Filter用于过滤显示字符串中包含指定内容的标签节点。注意是可显示的字符串,不可显示的字符串中的内容(例如注释,链接等等)不会被显示

    RegexFilter :   
    根据正则表达式匹配节点.与LinkRegexFilter不同的是,LinkRegexFilter只在LinkTag中寻找匹配

    NodeClassFilter: 
    根据已定义的标签类获取节点

    LinkStringFilter:
    这个Filter用于判断链接中是否包含某个特定的字符串,可以用来过滤出指向某个特定网站的链接。

    OrFilter:  
    是结合几种过滤条件的'或'过滤器 

    AndFilter:     
    是结合几种过滤条件的'与'过滤器

    实例应用

    NodeClassFilter过滤器实例

        /**
         * 
         * 过滤页面中的标签信息
         * 
         * @param url        要解析的url页面
         * @param encoding    使用的字符编码
         * @param tagclass    
         *                     要或取得页面标签,如要获取页面中的超链接 值为LinkTag.class,要获取页面中图片链接,值为ImageTag.class
         *                     要传入的标签类为org.htmlparser.tags下的
         */
        public static void nodeFilterTagClass(String url,String encoding,Class tagclass){
            try {
                Parser parser = new Parser();
                parser.setURL(url);
                if(null==encoding){
                    parser.setEncoding(parser.getEncoding());
                }else{
                    parser.setEncoding(encoding);
                }
                //过滤页面中的链接标签
                NodeFilter filter = new NodeClassFilter(tagclass);
                NodeList list = parser.extractAllNodesThatMatch(filter);
                for(int i=0; i<list.size();i++){
                    Node node = (Node)list.elementAt(i);
                    System.out.println("link is :" + node.toHtml());
                }
                
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public static void main(String[] args) {
            
            String url = "http://wenku.baidu.com/search?word=htmlparser&lm=0&od=0&fr=top_home";
            
            //获取页面中的<a href='xxx' [属性]>格式的链接
            nodeFilterTagClass(url, "UTF-8", LinkTag.class);
        
            //或取页面中的<img src='xxx' [属性='属性值']>格式的链接
            nodeFilterTagClass(url, "UTF-8", ImageTag.class);
            
            //或取页面<title>xxxx</title>标题
            nodeFilterTagClass(url, "UTF-8", TitleTag.class);
            
            //获取页面<div [属性='属性值']> xxx</div>
            //nodeFilterTagClass(url, "UTF-8", Div.class);
    
    }

    程序运行结果:



    TagNameFilter实例应用
    是最容易理解的一个Filter,根据Tag的名字进行过滤

        /**
         * 
         * 根据标签名过滤页面中的标签信息
         * 
         * @param url        要解析的url页面
         * @param encoding    使用的字符编码
         * @param tagName    标签名
         */
        public static void nodeFilterTagName(String url,String encoding,String tagName){
            try {
                Parser parser = new Parser();
                parser.setURL(url);
                if(null==encoding){
                    parser.setEncoding(parser.getEncoding());
                }else{
                    parser.setEncoding(encoding);
                }
                //过滤页面中的链接标签
                NodeFilter filter = new TagNameFilter(tagName);
                NodeList list = parser.extractAllNodesThatMatch(filter);
                for(int i=0; i<list.size();i++){
                    Node node = (Node)list.elementAt(i);
                    System.out.println("link is :" + node.toHtml());
                }
                
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public static void main(String[] args) {
            
            String url = "http://wenku.baidu.com/search?word=htmlparser&lm=0&od=0&fr=top_home";
            
            //获取页面中的<a href='xxx' [属性]>格式的链接
            nodeFilterTagName(url, "UTF-8", "a");
            
            //或取页面中的<img src='xxx' [属性='属性值']>格式的链接
            nodeFilterTagName(url, "UTF-8", "img");
            
            //获取页面中的<div>链接
            //nodeFilterTagName(url, "UTF-8", "div");
            
        }

    程序运行结果同上

    StringFilter实例应用
    过滤显示字符串中包含指定内容的标签节点。注意是可显示的字符串,不可显示的字符串中的内容(例如注释,链接等等)不会被显示

        /**
         * 过滤显示字符串中包含指定内容的标签节点。注意是可显示的字符串,不可显示的字符串中的内容(例如注释,链接等等)不会被显示
         * 
         * @param url        请求处理的url
         * @param encoding    字符编码
         * @param containStr包含的指定内容
         */
        public static void stringFilter(String url,String encoding,String containStr){
            try {
                Parser parser = new Parser();
                parser.setURL(url);
                if(null==encoding){
                    parser.setEncoding(parser.getEncoding());
                }else{
                    parser.setEncoding(encoding);
                }
                //OrFilter是结合几种过滤条件的‘或’过滤器
                NodeFilter filter = new StringFilter(containStr);
                NodeList list = parser.extractAllNodesThatMatch(filter);
                for(int i=0; i<list.size();i++){
                    Node node = (Node)list.elementAt(i);
                    System.out.println("link is :" + node.toHtml());
                }
                
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public static void main(String[] args) {
            
            String url = "http://wenku.baidu.com/search?word=htmlparser&lm=0&od=0&fr=top_home";
            stringFilter(url, "UTF-8", "img.baidu.com");
            
        }

    程序运行结果




    OrFilter实例应用
    OrFilter是结合几种过滤条件的‘或’过滤器,与此相反的是AndFilter,AndFilter是集合几个过滤条件的‘与’过滤器

        /**
         * OrFilter是结合几种过滤条件的‘或’过滤器
         * 
         * 一般主题信息包含在下列标签中:<table>、<tr>、<td>、<p>、<div>等。如果要过滤出这些节点标签,可以使用OrFilter过滤器
         * 
         * @param url        请求处理的url
         * @param encoding    使用的字符编码
         * @param filters    多个过滤器数组
         */
        public static void orMultiFilter(String url,String encoding,NodeFilter[] filters){
            try {
                Parser parser = new Parser();
                parser.setURL(url);
                if(null==encoding){
                    parser.setEncoding(parser.getEncoding());
                }else{
                    parser.setEncoding(encoding);
                }
                //OrFilter是结合几种过滤条件的‘或’过滤器
                NodeFilter filter = new OrFilter(filters);
                NodeList list = parser.extractAllNodesThatMatch(filter);
                for(int i=0; i<list.size();i++){
                    Node node = (Node)list.elementAt(i);
                    System.out.println("link is :" + node.toHtml());
                }
                
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
            
        public static void main(String[] args) {
            
            String url = "http://wenku.baidu.com/search?word=htmlparser&lm=0&od=0&fr=top_home";
            //过滤多个标签 或关系
            NodeFilter[]  filters = new NodeFilter[3];
            filters[0] = new NodeClassFilter(TableTag.class); 
            filters[1] = new NodeClassFilter(ParagraphTag.class);
            filters[2] = new NodeClassFilter(ImageTag.class);
            orMultiFilter(url, "UTF-8", filters);
                    
        }

    程序运行结果:




    RegexFilter与LinkRegexFilter实例应用
    RegexFilter根据正则表达式匹配节点.与LinkRegexFilter不同的是,LinkRegexFilter只在LinkTag中寻找匹配

        /**
         * 在文本中通过正则进行匹配
         * 
         * @param url        请求处理的url
         * @param encoding    字符编码
         * @param regex        待匹配的正则表达式
         */
        public static void regexStringFilter(String url,String encoding,String regex){
            try {
                Parser parser = new Parser();
                parser.setURL(url);
                if(null==encoding){
                    parser.setEncoding(parser.getEncoding());
                }else{
                    parser.setEncoding(encoding);
                }
                //OrFilter是结合几种过滤条件的‘或’过滤器
                NodeFilter filter = new RegexFilter(regex);
                NodeList list = parser.extractAllNodesThatMatch(filter);
                for(int i=0; i<list.size();i++){
                    Node node = (Node)list.elementAt(i);
                    System.out.println("link is :" + node.toHtml());
                }
                
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        /**
         * 在链接地址中进行正则匹配,返回的是Link结点
         * 
         * @param url        请求url
         * @param encoding    字符编码
         * @param regex        待匹配的正则表达式
         */
        public static void linkTagRegexFilter(String url,String encoding,String regex){
            try {
                Parser parser = new Parser();
                parser.setURL(url);
                if(null==encoding){
                    parser.setEncoding(parser.getEncoding());
                }else{
                    parser.setEncoding(encoding);
                }
                //OrFilter是结合几种过滤条件的‘或’过滤器
                NodeFilter filter = new LinkRegexFilter(regex);
                NodeList list = parser.extractAllNodesThatMatch(filter);
                for(int i=0; i<list.size();i++){
                    Node node = (Node)list.elementAt(i);
                    System.out.println("link is :" + node.toHtml());
                }
                
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        public static void main(String[] args) {
            
            String url =  "F:/dennisit/email.txt";
    
            String emailRegex = "[a-zA-Z0-9_-]+@\w+\.[a-z]+(\.[a-z]+)?";  
            regexStringFilter(url, "UTF-8", emailRegex);
            System.out.println("-------------------------------------------");
            linkTagRegexFilter(url, "UTF-8", emailRegex);
            
        }

    程序运行结果


    转载请注明出处:[http://www.cnblogs.com/dennisit/p/3191803.html]

  • 相关阅读:
    自定义组件要加@click方法
    绑定样式
    647. Palindromic Substrings
    215. Kth Largest Element in an Array
    448. Find All Numbers Disappeared in an Array
    287. Find the Duplicate Number
    283. Move Zeroes
    234. Palindrome Linked List
    202. Happy Number
    217. Contains Duplicate
  • 原文地址:https://www.cnblogs.com/dennisit/p/3191803.html
Copyright © 2011-2022 走看看