Java网络爬虫--HtmlParser应用

来源:互联网 发布:pb数据窗口列标题修改 编辑:程序博客网 时间:2024/06/08 00:08

本文转载自:[http://www.cnblogs.com/dennisit/p/3191803.html]

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

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

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

Filter就是对于结果进行过滤,取得需要的内容。HTMLParser在org.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实例应用

/**     *      * 根据标签名过滤页面中的标签信息     *      * @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是结合几种过滤条件的‘或’过滤器     *      * 一般主题信息包含在下列标签中:<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);    }
0 0
原创粉丝点击