} } }

    HtmlParser应用,应用Filter从爬取到的网页中获取须要的内容

    添加时间:2013-7-15 点击量:

    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);
    ifnull==encoding){
    parser.setEncoding(parser.getEncoding());
    }
    else{
    parser.setEncoding(encoding);
    }
    //过滤页面中的链接标签
    NodeFilter filter = new NodeClassFilter(tagclass);
    NodeList list
    = parser.extractAllNodesThatMatch(filter);
    forint 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);
    ifnull==encoding){
    parser.setEncoding(parser.getEncoding());
    }
    else{
    parser.setEncoding(encoding);
    }
    //过滤页面中的链接标签
    NodeFilter filter = new TagNameFilter(tagName);
    NodeList list
    = parser.extractAllNodesThatMatch(filter);
    forint 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);
    ifnull==encoding){
    parser.setEncoding(parser.getEncoding());
    }
    else{
    parser.setEncoding(encoding);
    }
    //OrFilter是连络几种过滤前提的‘或’过滤器
    NodeFilter filter = new StringFilter(containStr);
    NodeList list
    = parser.extractAllNodesThatMatch(filter);
    forint 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);
    ifnull==encoding){
    parser.setEncoding(parser.getEncoding());
    }
    else{
    parser.setEncoding(encoding);
    }
    //OrFilter是连络几种过滤前提的‘或’过滤器
    NodeFilter filter = new OrFilter(filters);
    NodeList list
    = parser.extractAllNodesThatMatch(filter);
    forint 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);
    ifnull==encoding){
    parser.setEncoding(parser.getEncoding());
    }
    else{
    parser.setEncoding(encoding);
    }
    //OrFilter是连络几种过滤前提的‘或’过滤器
    NodeFilter filter = new RegexFilter(regex);
    NodeList list
    = parser.extractAllNodesThatMatch(filter);
    forint 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);
    ifnull==encoding){
    parser.setEncoding(parser.getEncoding());
    }
    else{
    parser.setEncoding(encoding);
    }
    //OrFilter是连络几种过滤前提的‘或’过滤器
    NodeFilter filter = new LinkRegexFilter(regex);
    NodeList list
    = parser.extractAllNodesThatMatch(filter);
    forint 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]


    我们永远不要期待别人的拯救,只有自己才能升华自己。自己已准备好了多少容量,方能吸引对等的人与我们相遇,否则再美好的人出现、再动人的事情降临身边,我们也没有能量去理解与珍惜,终将擦肩而过。—— 姚谦《品味》
    分享到: