您的位置:68399皇家赌场 > 域名注册 > 68399皇家赌场:(转)三、htmlparser使用指南

68399皇家赌场:(转)三、htmlparser使用指南

发布时间:2019-07-07 03:09编辑:域名注册浏览(90)

    前边在本地互连网中建了多少个CentOS软件源,相当好用的,【见 yum局域网软件源搭建 http://www.linuxidc.com/Linux/2013-07/87315.htm 】可是开采有一些软件只怕装不上,因为系统安装盘中的包并不全,有个别软件的信赖在updates源中,updates源在英特网,怎么把当中的包获得啊?一种格局,当然也是最最健康的措施,就是做个安顿职务,按时从CentOS官方镜像站中联合。

        html的功能照旧官方说得最为清楚,

    清单 9 FileDownLoader.java
    package com.ie;
    
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
    import org.apache.commons.httpclient.HttpClient;
    import org.apache.commons.httpclient.HttpException;
    import org.apache.commons.httpclient.HttpStatus;
    import org.apache.commons.httpclient.methods.GetMethod;
    import org.apache.commons.httpclient.params.HttpMethodParams;
    
    public class FileDownLoader {
    
        /**根据 url 和网页类型生成需要保存的网页的文件名
         *去除掉 url 中非文件名字符 
         */
        public  String getFileNameByUrl(String url,String contentType)
        {
            url=url.substring(7);//remove http://
            if(contentType.indexOf("html")!=-1)//text/html
            {
                url= url.replaceAll("[\?/:*|<>"]", "_") ".html";
                return url;
            }
            else//如application/pdf
            {
    return url.replaceAll("[\?/:*|<>"]", "_") "."  
              contentType.substring(contentType.lastIndexOf("/") 1);
            }   
        }
    
        /**保存网页字节数组到本地文件
         * filePath 为要保存的文件的相对地址
         */
        private void saveToLocal(byte[] data,String filePath)
        {
            try {
                DataOutputStream out=new DataOutputStream(
    new FileOutputStream(new File(filePath)));
                for(int i=0;i<data.length;i  )
                out.write(data[i]);
                out.flush();
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        /*下载 url 指向的网页*/
        public String  downloadFile(String url)
        {
              String filePath=null;
              /* 1.生成 HttpClinet 对象并设置参数*/
              HttpClient httpClient=new HttpClient();
              //设置 Http 连接超时 5s
                  httpClient.getHttpConnectionManager().getParams().
    setConnectionTimeout(5000);
    
              /*2.生成 GetMethod 对象并设置参数*/
              GetMethod getMethod=new GetMethod(url);    
              //设置 get 请求超时 5s
              getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT,5000);
              //设置请求重试处理
              getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
                new DefaultHttpMethodRetryHandler());
    
              /*3.执行 HTTP GET 请求*/
              try{ 
                  int statusCode = httpClient.executeMethod(getMethod);
                  //判断访问的状态码
                  if (statusCode != HttpStatus.SC_OK) 
                  {
    System.err.println("Method failed: "  getMethod.getStatusLine());
                      filePath=null;
                  }
    
                  /*4.处理 HTTP 响应内容*/
     byte[] responseBody = getMethod.getResponseBody();//读取为字节数组
                  //根据网页 url 生成保存时的文件名
    filePath="temp\" getFileNameByUrl(url,
               getMethod.getResponseHeader("Content-Type").getValue());
                saveToLocal(responseBody,filePath);
              } catch (HttpException e) {
                       // 发生致命的异常,可能是协议不对或者返回的内容有问题
                       System.out.println("Please check your provided http 
    address!");
                       e.printStackTrace();
                      } catch (IOException e) {
                       // 发生网络异常
                       e.printStackTrace();
                      } finally {
                       // 释放连接
                       getMethod.releaseConnection();          
                      }
                      return filePath;
        }
        //测试的 main 方法
        public static void main(String[]args)
        {
            FileDownLoader downLoader = new FileDownLoader();
            downLoader.downloadFile("http://www.twt.edu.cn");
        }
    }
    

    而是大家也等于在地头用用,不必要一块,于是写了个Java程序,找了个速度相当慢的镜像(东交高校的,写程序的时候北理工的镜像站打不开),直接很暴力地把上面的updates目录下的包( HttpClient接口的工具类:

        The two fundamental use-cases that are handled by the parser are extraction and transformation (the syntheses use-case, where HTML pages are created from scratch, is better handled by other tools closer to the source of data). While prior versions concentrated on data extraction from web pages, Version 1.4 of the HTMLParser has substantial improvements in the area of transforming web pages, with simplified tag creation and editing, and verbatim toHtml() method output.

    getText:/title

    1. import java.util.HashMap;  
    2. import java.util.Map;  
    3. import org.htmlparser.Node;  
    4. import org.htmlparser.NodeFilter;  
    5. import org.htmlparser.Parser;  
    6. import org.htmlparser.tags.LinkTag;  
    7. import org.htmlparser.util.NodeList;  
    8. import com.yao.http.HttpRequester;  
    9. import com.yao.http.HttpRespons;  
    10.    
    11. /** 
    12.  * JAVA中使用Htmlparse剖析HTML文书档案,使用htmlparse遍历出HTML文书档案的享有超链接(<a>标志)。 
    13.  *  
    14.  * @author YYmmiinngg 
    15.  */  
    16. public class Test {  
    17.     public static void main(String[] args) {  
    18.         try {  
    19. /* 首先大家先使用HttpRequester类和HttpRespons类获得贰个HTTP央求中的数据(HTML文档)。 能够从( 
    20. */  
    21.             Map<String, String> map = new HashMap<String, String>();  
    22.             HttpRequester request = new HttpRequester();  
    23.             HttpRespons hr = request.sendGet("");  
    24.    
    25.             Parser parser = Parser.createParser(hr.getContent(), hr  
    26.                     .getContentEncoding());  
    27.             try {  
    28.                 // 通过过滤器过滤出<A>标签  
    29.                 NodeList nodeList = parser  
    30.                         .extractAllNodesThatMatch(new NodeFilter() {  
    31.                             //达成该办法,用以过滤标签  
    32.                             public boolean accept(Node node) {  
    33.                                 if (node instanceof LinkTag)//<A>标记  
    34.                                     return true;  
    35.                                 return false;  
    36.                             }  
    37.                         });  
    38.                 // 打印  
    39.                 for (int i = 0; i < nodeList.size(); i ) {  
    40.                     LinkTag n = (LinkTag) nodeList.elementAt(i);  
    41.                     System.out.print(n.getStringText()   " ==>> ");  
    42.                     System.out.println(n.extractLink());  
    43.                 }  
    44.             } catch (Exception e) {  
    45.                 e.printStackTrace();  
    46.             }  
    47.    
    48.         } catch (Exception e) {  
    49.             e.printStackTrace();  
    50.         }  
    51.     }  
    52. }  

    68399皇家赌场 1

    急需做贰个笔直找出引擎,相比了nekohtml和htmlparser 的功用,就算nekohtml在容错性、品质等方面包车型大巴祝词好像比htmlparser好(htmlunit也用的是nekohtml),但以为nekohtml的测验用例和文书档案都比htmlparser都少,况且htmlparser基本上能够满意垂直搜索引擎页面管理分析的急需,由此先钻探一 下htmlparser的使用,有空再商量nekohtml和mozilla html parser的应用。

    简易爬虫达成流程

    在看简易爬虫的落到实处代码从前,先介绍一下粗略爬虫爬取网页的流水生产线。

    public class Main
    {
     public static void main(String[] args)
     {
      try
      {
       //要抓取的目录
       String baseUrl = "";
       String html = HttpFactory.getInstance().getPageContent(baseUrl);
       //存放软件包的地面目录
       String rootDir = "/home/Hadoop/updates/";
       Parser parser = Parser.createParser(html, "utf-8");
       HtmlPage page = new HtmlPage(parser);
       parser.visitAllNodesWith(page);
       NodeFilter filter = new TagNameFilter("TABLE");
       NodeList nodes = page.getBody().extractAllNodesThatMatch(filter,
         true);
       int num = 0;
       for (int i = 0; i < nodes.size(); i)
       {
        TableTag tableTag = (TableTag) nodes.elementAt(i);
        TableRow[] rows = tableTag.getRows();
        for (TableRow row : rows)
        {
         TableColumn[] columns = row.getColumns();
         if (columns != null && columns.length > 0)
         {
          if (num > 0)
          {
           String fileName = columns[0].toPlainTextString().trim();
           String url = baseUrl fileName;
           System.out.println(url);
           File rpmFile = new File(rootDir fileName);
           FileOutputStream outputStream = new FileOutputStream(rpmFile);
           InputStream inputStream = HttpFactory.getInstance().getResponseEntity(url).getContent();
           byte b[] = new byte[1024*1024];
           int j = 0;
           while ((j = inputStream.read(b)) != -1)
           {
            outputStream.write(b, 0, j);
           }
           outputStream.flush();
           outputStream.close();
           inputStream.close();
          }
          num ;
         }
        }
       }
       System.out.println(num-1 " packages downloaded.");
      }
      catch (Exception e)
      {
       e.printStackTrace();
      }
     }
    }

     

    总结

    那 篇小说主假若介绍与显示了什么运用开源的 HttpClinet 包和 HtmlParser 包,以及结合那五头来交给了一个轻便易行网络爬虫程序的兑现,当然那一个爬虫与实际真正的爬虫如故颇具区别。由于越多的目标是关怀那五个开源包的使用,加上本文 篇幅有限,由此,未有对这三个开源包做老大详细的介绍。希望这篇小说能够指点读者对 HttpClient 包和 HtmlParser 产生兴趣,进而选用他们创设庞大的 JAVA 互连网应用程序。

    回页首

    换别的镜像站恐怕须要变变html剖判的代码。

    1、htmlparser对html页面管理的数据结构

    68399皇家赌场 2  

    如图所示,HtmlParser选用了杰出的Composite方式,通过RemarkNode、TextNode、TagNode、AbstractNode和Tag来说述HTML页面各因素。

    • org.htmlparser.Node:

        Node接口定义了拓展树形结构节点操作的各样标准操作方法,包涵:

        节点到html文本、text文本的不二诀窍:toPlainTextString、toHtml

       压倒元白树形结构遍历的法子:getParent、getChildren、getFirstChild、getLastChild、getPreviousSibling、getNextSibling、getText

        猎取节点对应的树形结构布局的一等节点Page对象方法:getPage

        赢得节点初阶地方的章程:getStartPosition、getEndPosition

       Visitor方法遍历节点时候方法:accept (NodeVisitor visitor)

        Filter方法:collectInto (NodeList list, NodeFilter filter)

        Object方法:toString、clone

    • org.htmlparser.nodes.AbstractNode

        AbstractNode是产生HTML树形结构抽象基类,达成了Node接口。

        在htmlparser中,Node分成三类:

        RemarkNode:代表Html中的注释

        TagNode:标签节点。

        TextNode:文本节点

        那三类节点都卫冕AbstractNode。

    • org.htmlparser.nodes.TagNode:

        TagNode富含了对HTML管理的主导的次第类,是全数TAG的基类,当中有分为富含其余TAG的复合节点ComositeTag和不含有其余TAG的叶子节点Tag。

        复合节点CompositeTag:   

            AppletTag,BodyTag,Bullet,BulletList,DefinitionList,DefinitionListBullet,Div,FormTag,FrameSetTag,HeadingTag,

            HeadTag,Html,LabelTag,LinkTag,ObjectTag,ParagraphTag,ScriptTag,SelectTag,Span,StyleTag,TableColumn,

           TableHeader,TableRow,TableTag,TextareaTag,TitleTag

        叶子节点TAG:

            BaseHrefTag,DoctypeTag,FrameTag,ImageTag,InputTag,JspTag,MetaTag,ProcessingInstructionTag,

    清单2
    PostMethod postMethod = new PostMethod("http://dict.cn/");
    postMethod.setRequestBody(new NameValuePair[]{new NameValuePair("q","java")});
    

    回页首

    package cn.edu.ruc.extract;

        琢磨的重大依旧extraction的利用,有空再研商transformation的选取。

    getText:body 

    更加多CentOS相关音信见CentOS 专项论题页面 http://www.linuxidc.com/topicnews.aspx?tid=14

    2、htmlparser对html页面管理的算法

    要害是之类三种方式

    • 行使Visitor方式访问Html

      try {
      
          Parser parser = new Parser();
      
          parser.setURL(”http://www.google.com")/;
      
          parser.setEncoding(parser.getEncoding());
      
          NodeVisitor visitor = new NodeVisitor() {
      
              public void visitTag(Tag tag) {
      
                  logger.fatal(”testVisitorAll()  Tag name is :”
      
                            tag.getTagName()   ” n Class is :”
      
                            tag.getClass());
      
              }
      
          };
      
          parser.visitAllNodesWith(visitor);
      
      } catch (ParserException e) {
      
          e.printStackTrace();
      
      }
      

       

    • 动用Filter方式访谈html

    • try {

          NodeFilter filter = new NodeClassFilter(LinkTag.class);
      
          Parser parser = new Parser();
      
          parser.setURL(”http://www.google.com")/;
      
          parser.setEncoding(parser.getEncoding());
      
          NodeList list = parser.extractAllNodesThatMatch(filter);
      
          for (int i = 0; i < list.size(); i  ) {
      
              LinkTag node = (LinkTag) list.elementAt(i);
      
              logger.fatal(”testLinkTag() Link is :”   node.extractLink());
      
          }
      
      } catch (Exception e) {
      
          e.printStackTrace();
      
      }
      

       

      //采用org.htmlparser.beans方式
      
      //另外htmlparser 还在org.htmlparser.beans中对一些常用的方法进行了封装,以简化操作,例如:
      
      Parser parser = new Parser();
      
      LinkBean linkBean = new LinkBean();
      
      linkBean.setURL(”http://www.google.com")/;
      
      URL[] urls = linkBean.getLinks();
      
      for (int i = 0; i < urls.length; i  ) {
      
          URL url = urls[i];
      
          logger.fatal(”testLinkBean() -url  is :”   url);
      
      }
      

       

       

      ### 3、htmlparser关键包结构表达

          htmlparser其实大旨代码并相当少,好好钻研一下其代码,弥补文书档案不足的主题材料。同有时候htmlparser的代码注释和单元测量试验用例依旧很齐全的,也推进精晓htmlparser的用法。

    3.2、org.htmlparser.beans

        对Visitor和Filter的主意开展了打包,定义了针对部分常用html成分操作的bean,简化对常用成分的领到操作。

        包括:FilterBean、HTMLLinkBean、HTMLTextBean、LinkBean、StringBean、BeanyBaby等。

    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.InputStream;

        HTML Parser is a Java library used to parse HTML in either a linear or nested fashion. Primarily used for transformation or extraction, it features filters, visitors, custom tags and easy to use JavaBeans. It is a fast, robust and well tested package.

    5、相关的门类

    nekohtml :评价比htmlparser好,把html正规化标准的xml文书档案,用xerces管理,但文书档案比较少。

    mozilla htmlparser:网站使用的html分析器,开源了,基于mozilla的分析器,值得研讨一下。

    任何一些html parser能够参见相关的集汉语章:

     

    import org.htmlparser.NodeFilter;
    import org.htmlparser.Parser;
    import org.htmlparser.filters.TagNameFilter;
    import org.htmlparser.tags.TableColumn;
    import org.htmlparser.tags.TableRow;
    import org.htmlparser.tags.TableTag;
    import org.htmlparser.util.NodeList;
    import org.htmlparser.visitors.HtmlPage;

    3.1、org.htmlparser

     

        定义了htmlparser的一部分基础类。当中最为重大的是Parser类。

        Parser是htmlparser的最基本的类,其构造函数提供了之类:Parser.createParser (String html, String charset)、 Parser ()、Parser (Lexer lexer, ParserFeedback fb)、Parser (UQX56LConnection connection, ParserFeedback fb)、Parser (String resource, ParserFeedback feedback)、 Parser (String resource)

      各构造函数的切实用法及意义能够查看其代码,很轻巧驾驭。

      Parser常用的多少个措施:

    •   elements获取元素
    • Parser parser = new Parser (”;

        for (NodeIterator i = parser.elements (); i.hasMoreElements (); )
      
          processMyNodes (i.nextNode ());
      

      parse (NodeFilter filter):通过NodeFilter方式获取

      visitAllNodesWith (NodeVisitor visitor):通过Nodevisitor方式

      extractAllNodesThatMatch (NodeFilter filter):通过NodeFilter方式

       

      #### 3.2、org.htmlparser.beans

          对Visitor和Filter的方法开始展览了打包,定义了针对性一些常用html成分操作的bean,简化对常用成分的领到操作。

          包括:FilterBean、HTMLLinkBean、HTMLTextBean、LinkBean、StringBean、BeanyBaby等。

      #### 3.3、org.htmlparser.nodes

          定义了根基的node,包罗:AbstractNode、RemarkNode、TagNode、TextNode等。

      #### 3.4、org.htmlparser.tags

          定义了htmlparser的各种tag。

      #### 3.5、org.htmlparser.filters

          定义了htmlparser所提供的各样filter,主要通过extractAllNodesThatMatch (NodeFilter filter)来对html页面钦点项指标因素进行过滤,包含:AndFilter、CssSelectorNodeFilter、 HasAttributeFilter、HasChildFilter、HasParentFilter、HasSiblingFilter、 IsEqualFilter、LinkRegexFilter、LinkStringFilter、NodeClassFilter、 NotFilter、OrFilter、RegexFilter、StringFilter、TagNameFilter、XorFilter

      #### 3.6、org.htmlparser.visitors

         定义了htmlparser所提供的各样visitor,主要通过visitAllNodesWith (NodeVisitor visitor)来对html页面元素进行遍历,包含:HtmlPage、LinkFindingVisitor、NodeVisitor、 ObjectFindingVisitor、StringFindingVisitor、TagFindingVisitor、 TextExtractingVisitor、UrlModifyingVisitor

       

      #### 3.7、org.htmlparser.parserapplications

         定义了一部分实用的工具,包含LinkExtractor、SiteCapturer、StringExtractor、WikiCapturer,那多少个类也得以当作htmlparser使用样例。

      #### 3.8、org.htmlparser.tests

         对各样功效的单元测量试验用例,也能够用作htmlparser使用的样例。

    • ### 4、htmlparser的使用样例

    • import java.net.URL;

      import junit.framework.TestCase;

      import org.apache.log4j.Logger;

      import org.htmlparser.Node;

      import org.htmlparser.NodeFilter;

      import org.htmlparser.Parser;

      import org.htmlparser.Tag;

      import org.htmlparser.beans.LinkBean;

      import org.htmlparser.filters.NodeClassFilter;

      import org.htmlparser.filters.OrFilter;

      import org.htmlparser.filters.TagNameFilter;

      import org.htmlparser.tags.HeadTag;

      import org.htmlparser.tags.ImageTag;

      import org.htmlparser.tags.InputTag;

      import org.htmlparser.tags.LinkTag;

      import org.htmlparser.tags.OptionTag;

      import org.htmlparser.tags.SelectTag;

      import org.htmlparser.tags.TableColumn;

      import org.htmlparser.tags.TableRow;

      import org.htmlparser.tags.TableTag;

      import org.htmlparser.tags.TitleTag;

      import org.htmlparser.util.NodeIterator;

      import org.htmlparser.util.NodeList;

      import org.htmlparser.util.ParserException;

      import org.htmlparser.visitors.HtmlPage;

      import org.htmlparser.visitors.NodeVisitor;

      import org.htmlparser.visitors.ObjectFindingVisitor;

      public class ParserTestCase extends TestCase {

         private static final Logger logger = Logger.getLogger(ParserTestCase.class);
      
         public ParserTestCase(String name) {
      
             super(name);
      
         }
      
         /*
      
          * 测试ObjectFindVisitor的用法
      
          */
      
         public void testImageVisitor() {
      
             try {
      
                 ImageTag imgLink;
      
                 ObjectFindingVisitor visitor = new ObjectFindingVisitor(
      
                         ImageTag.class);
      
                 Parser parser = new Parser();
      
                 parser.setURL(”http://www.google.com")/;
      
                 parser.setEncoding(parser.getEncoding());
      
                 parser.visitAllNodesWith(visitor);
      
                 Node[] nodes = visitor.getTags();
      
                 for (int i = 0; i < nodes.length; i  ) {
      
                     imgLink = (ImageTag) nodes[i];
      
                     logger.fatal(”testImageVisitor() ImageURL = “
      
                               imgLink.getImageURL());
      
                     logger.fatal(”testImageVisitor() ImageLocation = “
      
                               imgLink.extractImageLocn());
      
                     logger.fatal(”testImageVisitor() SRC = “
      
                               imgLink.getAttribute(”SRC”));
      
                 }
      
             }
      
             catch (Exception e) {
      
                 e.printStackTrace();
      
             }
      
         }
      
         /*
      
          * 测试TagNameFilter用法
      
          */
      
         public void testNodeFilter() {
      
             try {
      
                 NodeFilter filter = new TagNameFilter(”IMG”);
      
                 Parser parser = new Parser();
      
                 parser.setURL(”http://www.google.com")/;
      
                 parser.setEncoding(parser.getEncoding());
      
                 NodeList list = parser.extractAllNodesThatMatch(filter);
      
                 for (int i = 0; i < list.size(); i  ) {
      
                     logger.fatal(”testNodeFilter() ”   list.elementAt(i).toHtml());
      
                 }
      
             } catch (Exception e) {
      
                 e.printStackTrace();
      
             }
      
         }
      
         /*
      
          * 测试NodeClassFilter用法
      
          */
      
         public void testLinkTag() {
      
             try {
      
                 NodeFilter filter = new NodeClassFilter(LinkTag.class);
      
                 Parser parser = new Parser();
      
                 parser.setURL(”http://www.google.com")/;
      
                 parser.setEncoding(parser.getEncoding());
      
                 NodeList list = parser.extractAllNodesThatMatch(filter);
      
                 for (int i = 0; i < list.size(); i  ) {
      
                     LinkTag node = (LinkTag) list.elementAt(i);
      
                     logger.fatal(”testLinkTag() Link is :”   node.extractLink());
      
                 }
      
             } catch (Exception e) {
      
                 e.printStackTrace();
      
             }
      
         }
      
         /*
      
          * 测试<link href=” text=’text/css’ rel=’stylesheet’ />用法
      
          */
      
         public void testLinkCSS() {
      
             try {
      
                 Parser parser = new Parser();
      
                 parser
      
                         .setInputHTML(”<head><title>Link Test</title>”
      
                                   “<link href=’/test01/css.css’ text=’text/css’ rel=’stylesheet’ />”
      
                                   “<link href=’/test02/css.css’ text=’text/css’ rel=’stylesheet’ />”
      
                                   “</head>”   “<body>”);
      
                 parser.setEncoding(parser.getEncoding());
      
                 NodeList nodeList = null;
      
                 for (NodeIterator e = parser.elements(); e.hasMoreNodes();) {
      
                     Node node = e.nextNode();
      
                     logger
      
                             .fatal(”testLinkCSS()”   node.getText()
      
                                       node.getClass());
      
                 }
      
             } catch (Exception e) {
      
                 e.printStackTrace();
      
             }
      
         }
      
         /*
      
          * 测试OrFilter的用法
      
          */
      
         public void testOrFilter() {
      
             NodeFilter inputFilter = new NodeClassFilter(InputTag.class);
      
             NodeFilter selectFilter = new NodeClassFilter(SelectTag.class);
      
             Parser myParser;
      
             NodeList nodeList = null;
      
             try {
      
                 Parser parser = new Parser();
      
                 parser
      
                         .setInputHTML(”<head><title>OrFilter Test</title>”
      
                                   “<link href=’/test01/css.css’ text=’text/css’ rel=’stylesheet’ />”
      
                                   “<link href=’/test02/css.css’ text=’text/css’ rel=’stylesheet’ />”
      
                                   “</head>”
      
                                   “<body>”
      
                                   “<input type=’text’ value=’text1′ name=’text1′/>”
      
                                   “<input type=’text’ value=’text2′ name=’text2′/>”
      
                                   “<select><option id=’1′>1</option><option id=’2′>2</option><option id=’3′></option></select>”
      
                                   “<a href=’http://www.yeeach.com'/>yeeach.com</a>”
      
                                   “</body>”);
      
                 parser.setEncoding(parser.getEncoding());
      
                 OrFilter lastFilter = new OrFilter();
      
                 lastFilter.setPredicates(new NodeFilter[] { selectFilter,
      
                         inputFilter });
      
                 nodeList = parser.parse(lastFilter);
      
                 for (int i = 0; i <= nodeList.size(); i  ) {
      
                     if (nodeList.elementAt(i) instanceof InputTag) {
      
                         InputTag tag = (InputTag) nodeList.elementAt(i);
      
                         logger.fatal(”OrFilter tag name is :”   tag.getTagName()
      
                                   ” ,tag value is:”   tag.getAttribute(”value”));
      
                     }
      
                     if (nodeList.elementAt(i) instanceof SelectTag) {
      
                         SelectTag tag = (SelectTag) nodeList.elementAt(i);
      
                         NodeList list = tag.getChildren();
      
                         for (int j = 0; j < list.size(); j  ) {
      
                             OptionTag option = (OptionTag) list.elementAt(j);
      
                             logger
      
                                     .fatal(”OrFilter Option”
      
                                               option.getOptionText());
      
                         }
      
                     }
      
                 }
      
             } catch (ParserException e) {
      
                 e.printStackTrace();
      
             }
      
         }
      
         /*
      
          * 测试对<table><tr><td></td></tr></table>的解析
      
          */
      
         public void testTable() {
      
             Parser myParser;
      
             NodeList nodeList = null;
      
             myParser = Parser.createParser(”<body> ”   “<table id=’table1′ >”
      
                       “<tr><td>1-11</td><td>1-12</td><td>1-13</td>”
      
                       “<tr><td>1-21</td><td>1-22</td><td>1-23</td>”
      
                       “<tr><td>1-31</td><td>1-32</td><td>1-33</td></table>”
      
                       “<table id=’table2′ >”
      
                       “<tr><td>2-11</td><td>2-12</td><td>2-13</td>”
      
                       “<tr><td>2-21</td><td>2-22</td><td>2-23</td>”
      
                       “<tr><td>2-31</td><td>2-32</td><td>2-33</td></table>”
      
                       “</body>”, “GBK”);
      
             NodeFilter tableFilter = new NodeClassFilter(TableTag.class);
      
             OrFilter lastFilter = new OrFilter();
      
             lastFilter.setPredicates(new NodeFilter[] { tableFilter });
      
             try {
      
                 nodeList = myParser.parse(lastFilter);
      
                 for (int i = 0; i <= nodeList.size(); i  ) {
      
                     if (nodeList.elementAt(i) instanceof TableTag) {
      
                         TableTag tag = (TableTag) nodeList.elementAt(i);
      
                         TableRow[] rows = tag.getRows();
      
                         for (int j = 0; j < rows.length; j  ) {
      
                             TableRow tr = (TableRow) rows[j];
      
                             TableColumn[] td = tr.getColumns();
      
                             for (int k = 0; k < td.length; k  ) {
      
                                 logger.fatal(”<td>”   td[k].toPlainTextString());
      
                             }
      
                         }
      
                     }
      
                 }
      
             } catch (ParserException e) {
      
                 e.printStackTrace();
      
             }
      
         }
      
         /*
      
          * 测试NodeVisitor的用法,遍历所有节点
      
          */
      
         public void testVisitorAll() {
      
             try {
      
                 Parser parser = new Parser();
      
                 parser.setURL(”http://www.google.com")/;
      
                 parser.setEncoding(parser.getEncoding());
      
                 NodeVisitor visitor = new NodeVisitor() {
      
                     public void visitTag(Tag tag) {
      
                         logger.fatal(”testVisitorAll()  Tag name is :”
      
                                   tag.getTagName()   ” n Class is :”
      
                                   tag.getClass());
      
                     }
      
                 };
      
                 parser.visitAllNodesWith(visitor);
      
             } catch (ParserException e) {
      
                 e.printStackTrace();
      
             }
      
         }
      
         /*
      
          * 测试对指定Tag的NodeVisitor的用法
      
          */
      
         public void testTagVisitor() {
      
             try {
      
                 Parser parser = new Parser(
      
                         “<head><title>dddd</title>”
      
                                   “<link href=’/test01/css.css’ text=’text/css’ rel=’stylesheet’ />”
      
                                   “<link href=’/test02/css.css’ text=’text/css’ rel=’stylesheet’ />”
      
                                   “</head>”   “<body>”
      
                                   “<a href=’http://www.yeeach.com'/>yeeach.com</a>”
      
                                   “</body>”);
      
                 NodeVisitor visitor = new NodeVisitor() {
      
                     public void visitTag(Tag tag) {
      
                         if (tag instanceof HeadTag) {
      
                             logger.fatal(”visitTag() HeadTag : Tag name is :”
      
                                       tag.getTagName()   ” n Class is :”
      
                                       tag.getClass()   “n Text is :”
      
                                       tag.getText());
      
                         } else if (tag instanceof TitleTag) {
      
                             logger.fatal(”visitTag() TitleTag : Tag name is :”
      
                                       tag.getTagName()   ” n Class is :”
      
                                       tag.getClass()   “n Text is :”
      
                                       tag.getText());
      
                         } else if (tag instanceof LinkTag) {
      
                             logger.fatal(”visitTag() LinkTag : Tag name is :”
      
                                       tag.getTagName()   ” n Class is :”
      
                                       tag.getClass()   “n Text is :”
      
                                       tag.getText()   ” n getAttribute is :”
      
                                       tag.getAttribute(”href”));
      
                         } else {
      
                             logger.fatal(”visitTag() : Tag name is :”
      
                                       tag.getTagName()   ” n Class is :”
      
                                       tag.getClass()   “n Text is :”
      
                                       tag.getText());
      
                         }
      
                     }
      
                 };
      
                 parser.visitAllNodesWith(visitor);
      
             } catch (Exception e) {
      
                 e.printStackTrace();
      
             }
      
         }
      
         /*
      
          * 测试HtmlPage的用法
      
          */
      
         public void testHtmlPage() {
      
             String inputHTML = “<html>”   “<head>”
      
                       “<title>Welcome to the HTMLParser website</title>”
      
                       “</head>”   “<body>”   “Welcome to HTMLParser”
      
                       “<table id=’table1′ >”
      
                       “<tr><td>1-11</td><td>1-12</td><td>1-13</td>”
      
                       “<tr><td>1-21</td><td>1-22</td><td>1-23</td>”
      
                       “<tr><td>1-31</td><td>1-32</td><td>1-33</td></table>”
      
                       “<table id=’table2′ >”
      
                       “<tr><td>2-11</td><td>2-12</td><td>2-13</td>”
      
                       “<tr><td>2-21</td><td>2-22</td><td>2-23</td>”
      
                       “<tr><td>2-31</td><td>2-32</td><td>2-33</td></table>”
      
                       “</body>”   “</html>”;
      
             Parser parser = new Parser();
      
             try {
      
                 parser.setInputHTML(inputHTML);
      
                 parser.setEncoding(parser.getURL());
      
                 HtmlPage page = new HtmlPage(parser);
      
                 parser.visitAllNodesWith(page);
      
                 logger.fatal(”testHtmlPage -title is :”   page.getTitle());
      
                 NodeList list = page.getBody();
      
                 for (NodeIterator iterator = list.elements(); iterator
      
                         .hasMoreNodes();) {
      
                     Node node = iterator.nextNode();
      
                     logger.fatal(”testHtmlPage -node  is :”   node.toHtml());
      
                 }
      
             } catch (ParserException e) {
      
                 // TODO Auto-generated catch block
      
                 e.printStackTrace();
      
             }
      
         }
      
         /*
      
          * 测试LinkBean的用法
      
          */
      
         public void testLinkBean() {
      
             Parser parser = new Parser();
      
             LinkBean linkBean = new LinkBean();
      
             linkBean.setURL(”http://www.google.com")/;
      
             URL[] urls = linkBean.getLinks();
      
             for (int i = 0; i < urls.length; i  ) {
      
                 URL url = urls[i];
      
                 logger.fatal(”testLinkBean() -url  is :”   url);
      
             }
      
         }
      

      }

       

      ### 5、相关的花色

      nekohtml :评价比htmlparser好,把html正规化标准的xml文书档案,用xerces管理,但文书档案相当少。

      mozilla htmlparser:网址使用的html深入分析器,开源了,基于mozilla的深入分析器,值得切磋一下。

      任何部分html parser能够参照他事他说加以考察相关的集普通话章:

       

      ### 6、参照他事他说加以考察文书档案

      来自;

    3.5、org.htmlparser.filters

        定义了htmlparser所提供的各类filter,首要通过extractAllNodesThatMatch (NodeFilter filter)来对html页面钦点项指标要素进行过滤,包含:AndFilter、CssSelectorNodeFilter、 HasAttributeFilter、HasChildFilter、HasParentFilter、HasSiblingFilter、 IsEqualFilter、LinkRegexFilter、LinkStringFilter、NodeClassFilter、 NotFilter、OrFilter、RegexFilter、StringFilter、TagNameFilter、XorFilter

    HtmlParser 基本类库使用

    HtmlParser 提供了精锐的类库来拍卖 Internet 上的网页,能够完毕对网页特定内容的领到和更改。上面通过多少个例子来介绍 HtmlParser 的有的选取。这个事例在那之中的代码,有一部分用在了背后介绍的大致爬虫中。以下有所的代码和措施都在在类 HtmlParser.Test.java 里,那是我编写的贰个用来测验 HtmlParser 用法的类。

    • 迭代遍历网页全体节点

    网页是三个半结构化的嵌套文本文件,有接近 XML 文件的树形嵌套结构。使用HtmlParser 能够让我们随意的迭代遍历网页的持有节点。清单 3 体现了什么样来达成那几个意义。

    getText:div id="top_main"

    ends at : 121

    getText:

    getPlainText:

    toHtml:

    toHtml(true):

    toHtml(false):

    getText:那是注释

    能够看来唯有RemarkNode(注释)被输出了。

    4.2 StringFilter
    其一Filter用于过滤展现字符串中含有制订内容的Tag。注意是可显示的字符串,不可展现的字符串中的内容(举个例子注释,链接等等)不会被呈现。
    修改一下例证代码:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ";
    <head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title>白泽居-title-www.baizeju.com</title></head>
    <html xmlns=";
    <body >
    <div id="top_main">
        <div id="logoindex">
            <!--那是注释白泽居-www.baizeju.com -->
            白泽居-字符串1-www.baizeju.com
    <a href=";
        </div>
        白泽居-字符串2-www.baizeju.com
    </div>
    </body>
    </html>

    测验代码:

               NodeFilter filter = new StringFilter("www.baizeju.com");
                NodeList nodes = parser.extractAllNodesThatMatch(filter);
    输出结果:

    参照他事他说加以考察资料

    学习

    • Developworks 学习其余关于 HttpClien t和 HtmlParser 的手艺小说。
    • Developworks 别的专区学习更加多的风靡才具。

    得到技艺和成品

    在 www.eclipse.org 获得无偿的 IDE

    讨论

    在 Developerworks 社区参与更加多的评论

     

     

     

     

     

    PostMethod

    PostMethod 方法与 GetMethod 方法的行使手续大意同样。但是出于 PostMethod 使用的是HTTP 的 Post 乞求,因此央浼参数的安装与 GetMethod 有所不一样。在 GetMethod 中,央求的参数直接写在 U奥迪Q3L 里,一般以如此方式出现: …。恳求参数是 name,value 对。例如本身想博得百度找寻“Thinking In Java”的结果网页,就能够使 GetMethod 的构造方法中的 url 为: 。而 PostMethod 则足以依样画葫芦网页里表单提交的历程,通过安装表单里 post 央浼参数的值,来动态的获得重回的网页结果。清单 第22中学的代码浮现了什么样创造四个 Post 对象,并安装相应的央浼参数。

    3.4、org.htmlparser.tags

        定义了htmlparser的各种tag。

    图 3. 爬虫流程图

    68399皇家赌场 3

    toString:Txt (238[1,115],240[2,0]): n

    getText:html xmlns=""
    getPlainText:

            
                    
                    白泽居-www.baizeju.com
    白泽居-www.baizeju.com
            
            白泽居-www.baizeju.com

    toHtml:<html xmlns=";
    <body >
    <div id="top_main">
            <div id="logoindex">
                    <!--那是注释-->
                    白泽居-www.baizeju.com
    <a href=";
            </div>
            白泽居-www.baizeju.com
    </div>
    </body>
    </html>
    toHtml(true):<html xmlns=";
    <body >
    <div id="top_main">
            <div id="logoindex">
                    <!--那是注释-->
                    白泽居-www.baizeju.com
    <a href=";
            </div>
            白泽居-www.baizeju.com
    </div>
    </body>
    </html>
    toHtml(false):<html xmlns=";
    <body >
    <div id="top_main">
            <div id="logoindex">
                    <!--那是注释-->
                    白泽居-www.baizeju.com
    <a href=";
            </div>
            白泽居-www.baizeju.com
    </div>
    </body>
    </html>
    toString:Tag (240[2,0],283[2,43]): html xmlns=""
    Txt (283[2,43],285[3,0]): n
    Tag (285[3,0],292[3,7]): body 
        Txt (292[3,7],294[4,0]): n
        Tag (294[4,0],313[4,19]): div id="top_main"
          Txt (313[4,19],316[5,1]): nt
          Tag (316[5,1],336[5,21]): div id="logoindex"
            Txt (336[5,21],340[6,2]): ntt
            Rem (340[6,2],351[6,13]): 那是注释
            Txt (351[6,13],376[8,0]): ntt白泽居-www.baizeju.comn
            Tag (376[8,0],409[8,33]): a href=""
              Txt (409[8,33],428[8,52]): 白泽居-www.baizeju.com
              End (428[8,52],432[8,56]): /a
            Txt (432[8,56],435[9,1]): nt
            End (435[9,1],441[9,7]): /div
          Txt (441[9,7],465[11,0]): nt白泽居-www.baizeju.comn
          End (465[11,0],471[11,6]): /div
        Txt (471[11,6],473[12,0]): n
        End (473[12,0],480[12,7]): /body
    Txt (480[12,7],482[13,0]): n
    End (482[13,0],489[13,7]): /html

    =================================================

    对此第一个Node的内容,对应的正是首先行<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
    从这些输出结果中,也得以见见内容的树状结构。或然说是树林结构。在Page内容的第一层Tag,如DOCTYPE,head和html,分别产生了一个最高层的Node节点(很五个人或然对第一个和第五个Node的源委有一点奇异。实际上那多少个Node正是多个换行符号。HTMLParser把HTML页面内容中的全体换行,空格,Tab等都转换到了对应的Tag,所以就应时而生了那样的Node。固然内容少可是等级高,呵呵)
    getPlainTextString是把用户能够观察的剧情都满含了。有意思的有两点,一是<head>标签中的Title内容是在plainText中的,大概在标题中可见的也算可知吧。别的便是象前边说的,HTML内容中的换行符什么的,也都成了plainText,这几个逻辑上类似有个别难点。

    除此以外大概我们发掘toHtml,toHtml(true)和toHtml(false)的结果没什么差异。实际也是那般的,假设追踪HTMLParser的代码就足以发掘,Node的子类是AbstractNode,当中落实了toHtml()的代码,直接调用toHtml(false),而AbstractNode的四个子类RemarkNode,TagNode和TextNode中,toHtml(boolean verbatim)的贯彻中,都未曾管理verbatim参数,所以五个函数的结果是一模二样的。借使你无需贯彻您自身的怎么样异样管理,轻便利用toHtml就能够了。

    HTML的Node类继承关系如下图(那么些是从别的小说Copy的):

     

     

    AbstractNodes是Node的直白子类,也是三个抽象类。它的七个一向子类完毕是RemarkNode,用于保存注释。在出口结果的toString部分中能够见见有三个"Rem (345[6,2],356[6,13]): 那是注释",正是三个RemarkNode。TextNode也很简短,正是用户可知的文字音讯。TagNode是最复杂的,包括了HTML语言中的全体标签,並且可以扩充(扩大HTMLParser 对自定义标签的管理技能)。TagNode包蕴两类,一类是简简单单的Tag,实际正是不能够包括其余Tag的价签,只可以做叶子节点。另一类是CompositeTag,正是能够涵盖别的Tag,是分支节点

    HTMLParser遍历了网页的内容以后,以树(森林)结构保留了结果。HTMLParser访谈结果内容的主意有二种。使用Filter和选用Visitor。

    (一)Filter类
    以文害辞,Filter正是对于结果开始展览过滤,取得供给的情节。HTMLParser在org.htmlparser.filters包之内一共定义了十七个例外的Filter,也足以分成几类。
    判断类Filter:
    TagNameFilter
    HasAttributeFilter
    HasChildFilter
    HasParentFilter
    HasSiblingFilter
    IsEqualFilter
    逻辑运算Filter:
    AndFilter
    NotFilter
    OrFilter
    XorFilter
    其他Filter:
    NodeClassFilter
    StringFilter
    LinkStringFilter
    LinkRegexFilter
    RegexFilter
    CssSelectorNodeFilter

    富有的Filter类都落实了org.htmlparser.NodeFilter接口。这些接口唯有一个主要函数:
    boolean accept (Node node);
    梯次子类分别完成那几个函数,用于判别输入的Node是或不是合乎那几个Filter的过滤条件,假如符合,再次来到true,不然再次回到false。

    (二)判断类Filter
    2.1 TagNameFilter
    TabNameFilter是最轻便理解的叁个Filter,遵照Tag的名字实行过滤。

    下边是用以测量试验的HTML文件:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ";
    <head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title>白泽居-www.baizeju.com</title>< /head>
    <html xmlns=";
    <body >
    <div id="top_main">
        <div id="logoindex">
            <!--那是注释-->
            白泽居-www.baizeju.com
    <a href=";
        </div>
        白泽居-www.baizeju.com
    </div>
    </body>
    </html>
    测验代码:(这里只列出了Main函数,全部代码请参谋 HTMLParser使用入门(2)- Node内容,自身增多import部分)
    public static void main(String[] args) {
            
            try{
                Parser parser = new Parser( (HttpURLConnection) (new URL(") );
            
                // 这里是决定测验的片段,前面包车型客车例子修改的就是以此地点。
               NodeFilter filter = new TagNameFilter ("DIV");
                NodeList nodes = parser.extractAllNodesThatMatch(filter);
     *
                
                if(nodes!=null) {
                    for (int i = 0; i < nodes.size(); i ) {
                        Node textnode = (Node) nodes.elementAt(i);
                        
                        message("getText:" textnode.getText());
                        message("=================================================");
                    }
                }            
            }
            catch( Exception e ) {     
                e.printStackTrace();
            }
        }
    出口结果:

    图 1. 开辟条件搭建

    68399皇家赌场 4

    回页首

    清单 10 HtmlParserTool.java
    package com.ie;
    
    import java.util.HashSet;
    import java.util.Set;
    
    import org.htmlparser.Node;
    import org.htmlparser.NodeFilter;
    import org.htmlparser.Parser;
    import org.htmlparser.filters.NodeClassFilter;
    import org.htmlparser.filters.OrFilter;
    import org.htmlparser.tags.LinkTag;
    import org.htmlparser.util.NodeList;
    import org.htmlparser.util.ParserException;
    
    public class HtmlParserTool {
        // 获取一个网站上的链接,filter 用来过滤链接
        public static Set<String> extracLinks(String url,LinkFilter filter) {
    
            Set<String> links = new HashSet<String>();
            try {
                Parser parser = new Parser(url);
                parser.setEncoding("gb2312");
                // 过滤 <frame >标签的 filter,用来提取 frame 标签里的 src 属性所表示的链接
                NodeFilter frameFilter = new NodeFilter() {
                    public boolean accept(Node node) {
                        if (node.getText().startsWith("frame src=")) {
                            return true;
                        } else {
                            return false;
                        }
                    }
                };
                // OrFilter 来设置过滤 <a> 标签,和 <frame> 标签
                OrFilter linkFilter = new OrFilter(new NodeClassFilter(
                        LinkTag.class), frameFilter);
                // 得到所有经过过滤的标签
                NodeList list = parser.extractAllNodesThatMatch(linkFilter);
                for (int i = 0; i < list.size(); i  ) {
                    Node tag = list.elementAt(i);
                    if (tag instanceof LinkTag)// <a> 标签
                    {
                        LinkTag link = (LinkTag) tag;
                        String linkUrl = link.getLink();// url
                        if(filter.accept(linkUrl))
                            links.add(linkUrl);
                    } else// <frame> 标签
                    {
                    // 提取 frame 里 src 属性的链接如 <frame src="test.html"/>
                        String frame = tag.getText();
                        int start = frame.indexOf("src=");
                        frame = frame.substring(start);
                        int end = frame.indexOf(" ");
                        if (end == -1)
                            end = frame.indexOf(">");
                        String frameUrl = frame.substring(5, end - 1);
                        if(filter.accept(frameUrl))
                            links.add(frameUrl);
                    }
                }
            } catch (ParserException e) {
                e.printStackTrace();
            }
            return links;
        }
        //测试的 main 方法
        public static void main(String[]args)
        {
    Set<String> links = HtmlParserTool.extracLinks(
    "http://www.twt.edu.cn",new LinkFilter()
            {
                //提取以 http://www.twt.edu.cn 开头的链接
                public boolean accept(String url) {
                    if(url.startsWith("http://www.twt.edu.cn"))
                        return true;
                    else
                        return false;
                }
    
            });
            for(String link : links)
                System.out.println(link);
        }
    }
    清单11 LinkFilter.java
    package com.ie;
    
    public interface LinkFilter {
        public boolean accept(String url);
    }
    

    这么些代码中根本的片段都在 HttpClient 和 HtmlParser 介绍中证实过了,其余一些也正如轻松,请感兴趣的读者自行精通。

    回页首

    getText:div id="logoindex"

    3.3 NotFilter
    把前边的AndFilter换到NotFilter
    测验代码:
    NodeFilter filterID = new HasAttributeFilter( "id" );
    NodeFilter filterChild = new HasChildFilter(filterA);
    NodeFilter filter = new NotFilter(new OrFilter(filterID, filterChild));
    出口结果:
    getText:!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

    本文由68399皇家赌场发布于域名注册,转载请注明出处:68399皇家赌场:(转)三、htmlparser使用指南

    关键词: 68399皇家赌场 互联网 搜索引擎 HTMLParser