zoukankan      html  css  js  c++  java
  • 利用HtmlParser解析网页内容

    一,htmpparser介绍

      htmlparser是一个功能比较强大的网页解析工具,主要用于 html 网页的转换(Transformation) 以及网页内容的抽取 (Extraction)。

    二,使用与示例

      1,提取网页某类型标签.这里,html的标签对应于一个标签类,如<img>标签对应于ImageTag.下面以提取<img>标签为例,输出网页图片地址:

            //读取文件内容
            String html = IOUtils.toString(new FileInputStream(localFile), "UTF-8");
            
            //创建html解析器
            Parser parser = new Parser();
         //设置解析的网页内容 parser.setInputHTML(html); NodeList imageTags
    = parser.parse(new NodeClassFilter(ImageTag.class)); for(int i=0; i<imageTags.size(); i++){ ImageTag it = (ImageTag) imageTags.elementAt(i); String imageUrl = it.getImageURL(); System.out.println(imageUrl); }

      2,提取特定标签.当要提取出某个属性值为xx的标签时,需要自定义过滤器来设定规则,获得相对应的标签。

            String html = IOUtils.toString(new FileInputStream(localFile), "UTF-8");
            
            //创建html解析器
            Parser parser = new Parser();
            parser.setInputHTML(html);
            
            //自定义过滤器来拿到指定名字的标签<meta name="keywords">
            NodeList metaTags = parser.parse(
                    new NodeFilter() {
                        
                        @Override
                        public boolean accept(Node node) {
                            if(node instanceof MetaTag){
                                MetaTag mt = (MetaTag) node;
                                
                                if(mt.getMetaTagName() != null && mt.getMetaTagName().equals("keywords")){
                                    return true;
                                }
                            }
                            return false;
                        }
                    }
                    );
            
            for(int i=0; i<metaTags.size(); i++){
                MetaTag mt = (MetaTag) metaTags.elementAt(i);
                System.out.println("meta keyword value : " + mt.getMetaContent());
            }

      3,通过以上的例子,熟悉了htmlparser的简单实用后,我们可以封装出一个方法,传入参数html内容,标签类型,标签属性名,标签属性值四个参数,就可返回特定标签列表。当然可以省略后两个参数,获得一系列某类标签。

        /**
         * 提取具有某个属性的标签列表
         * @param html  被提取的html文本
         * @param tagType  标签类型
         * @param attributeName  标签属性名称
         * @param attributeValue  该属性的值
         * @return
         */
        public static <T extends TagNode> List<T> parseTags(String html,final Class<T> tagType,final String attributeName,final String attributeValue){
            
            try {
                Parser parser = new Parser();
                parser.setInputHTML(html);
                
                //自定义过滤器来拿到指定名字的标签
                NodeList nodeList = parser.parse(
                        new NodeFilter() {
                            
                            @Override
                            public boolean accept(Node node) {
                                //如果是同类型的标签
                                if(node.getClass() == tagType){
                                    T t = (T) node;
                                    
                                    //只过滤该类型的标签
                                    if(attributeName == null){
                                        return true;
                                    }
                                    
                                    String attrValue = t.getAttribute(attributeName);
                                    //过滤掉特定属性名字的标签
                                    if(attrValue != null && attrValue.equals(attributeValue)){
                                        return true;
                                    }
                                }
                                return false;
                            }
                        }
                        );
                
                List<T> tags = new ArrayList<T>();
                for(int i=0; i<nodeList.size(); i++){
                    T t = (T) nodeList.elementAt(i);
                    tags.add(t);
                }
                return tags;
                
            } catch (Exception e) {
                e.printStackTrace();
            }
            
            return null;
        }
    View Code

    最后,这里只是简单介绍htmlparser2使用方法,详细情况请参看其官方文档。

  • 相关阅读:
    (二十五)Struts2 Tiles集成
    (二十四)Struts2 Spring集成
    etcd 和 redis的使用场景
    react v16.12 源码阅读环境搭建
    gmail邮箱怎么批量删除邮件
    动态创建的元素怎么做动画
    Window 添加定时任务
    commons-pool2-中的一些配置
    Activiti 5.18 流程Model 转成 流程BPMN文件
    Activiti 使用自己的身份认证服务
  • 原文地址:https://www.cnblogs.com/jianzhi/p/3362811.html
Copyright © 2011-2022 走看看