[置顶] htmlparser

有些时候我们想要抓取网上上的信息,然后对网页上信息进行提取,得到我们想要的数据,这时候我们可以用HtmlParser进行信息提取。下面介绍一下在项目中常用到的HtmlParser的一些用法:

1.       ObjectFindVisitor用法

例子如下: 查询出TABLE节点

package com;

import org.htmlparser.Node;

import org.htmlparser.Parser;

import org.htmlparser.tags.TableTag;

import org.htmlparser.visitors.ObjectFindingVisitor;

public class T{  

    public static void main(String[] args){

       System.out.println(testObjectFindVisitor());

    }

    /*

    * 测试ObjectFindVisitor的用法

    */ 

    public static String testObjectFindVisitor() { 

       String result ="";

       try { 

              //要解析的文件

             Parser parser = new Parser ("test.html");  

             //设置编码集

             parser.setEncoding("UTF-8");

             //取得TableTag节点 (TableTag.class)

ObjectFindingVisitor visitorTable = new ObjectFindingVisitor(TableTag.class);             

             parser.visitAllNodesWith(visitorTable);    

             Node[] nodesTable = visitorTable.getTags();         

             for (int i = 0; i < nodesTable.length; i++) { 

                TableTag tableTag = (TableTag) nodesTable[i]; 

                result = tableTag.toString();

             }             

             /**

              * 另外还有一些其它的节点类

              * ImageTag :图片

              * Div div

              * BodyTag body部分

              * FormTag :表单

              * HeadTag HEAD部分

              * FrameTag 等等               *

              */            

       }catch (Exception e) { 

           e.printStackTrace(); 

       } 

        return result;         

    }

  

}

Test.html中的内容为;

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title>test.html</title>   

  </head> 

  <body>

   <table>

   <tr>

        <th>用户名</th>

        <th>所属公司</th>     

   </tr>

   <tr>

        <td><a href="http://test1.com">test1</a></td>    

        <td>test1公司</td>       

   </tr>

   <tr>

        <td><a href="http://test2.com">test2</a></td>       

        <td>test2公司</td>    

   </tr>

   </table>

  </body>

</html>

 

打印结果为:

TableTag

********

<table>

   <tr>

        <th>用户名</th>

        <th>所属公司</th>     

   </tr>

   <tr>

        <td><a href="http://test1.com">test1</a></td>    

        <td>test1公司</td>       

   </tr>

   <tr>

        <td><a href="http://test2.com">test2</a></td>       

        <td>test2公司</td>    

   </tr>

   </table>

 

2. NodeClassFilter用法(和上面的输入结果一样)

/*

* 测试NodeClassFilter用法(过滤得到我们要的节点)

*/ 

public static void testNodeClassFilter() { 

try {     

       //得到Table节点数据

           NodeFilter filter = new NodeClassFilter(TableTag.class); 

           Parser parser = new Parser (test.html"); 

           parser.setEncoding("UTF-8");             

           NodeList list = parser.extractAllNodesThatMatch(filter); 

           Node[] nodes = list.toNodeArray();

           for (int i = 0; i < nodes.length; i++) { 

                  TableTag table = (TableTag) nodes[i];

                 System.out.println(table.toString());

           } 

} catch (Exception e) { 

        e.printStackTrace(); 

}     

} 

3         OrFilter的用法, 联合ObjectFindVisitorNodeClassFilter使用

例如:查找出TABLE然后,提取里面的文本和链接,放入到User对象中

User.java

package com;

public class User {

    //用户名

    String name ="";

    /**

* 详情(我们一般不这么放,这里只是一个例子,一般这个都是附件等的一些地址,这里就不做特殊处理)

     */

    String href ="";

    //公司

    String company="";

    public String getCompany() {

       return company;

    }

    public void setCompany(String company) {

       this.company = company;

    }

    public String getHref() {

       return href;

    }

    public void setHref(String href) {

       this.href = href;

    }

    public String getName() {

       return name;

    }

    public void setName(String name) {

       this.name = name;

    }

}

处理类

/**

* OrFilter的用法

* 联合ObjectFindVisitorNodeClassFilter使用

*

* @return

*/

 public static List<User> getUserList(){

    List<User> userlist = new ArrayList<User>();

    try{             

       ObjectFindingVisitor visitor = new                    ObjectFindingVisitor(TableTag.class);

       Parser parser = new Parser ("test.html");

       parser.setEncoding("UTF-8");

       parser.visitAllNodesWith(visitor);

       Node[] nodes = visitor.getTags();

       String content ="";

       for (int i = 0; i < nodes.length; i++) {

           TableTag tableTag = (TableTag) nodes[i];               

           if (tableTag.toString().indexOf("TableTag")>=0 ){

              content = tableTag.toString();               

              content = content.trim();

content=content.substring(content.indexOf("<table>"),content.indexOf("</table>"));

              break;

           }

       }            

       List list = new ArrayList();

       //上半部分是用ObjectFindingVisitor,提取出TABLE

       //---------------------------------------------

       //下半部分是用OrFilterNodeClassFilter提取出文本和链接内容

if (!content.equals("")){

       NodeList nodeList = null;

       Parser myParser = Parser.createParser(content, "UTF-8");

       //文本内容

       NodeFilter textFilter = new NodeClassFilter(TextNode.class);

       //链接内容

       NodeFilter linkFilter = new NodeClassFilter(LinkTag.class);

       OrFilter filter = new OrFilter();

filter.setPredicates(new NodeFilter[] { textFilter, linkFilter });

       nodeList = myParser.parse(filter);

       //取得所有的文本和链接节点

       Node[] d_nodes = nodeList.toNodeArray(); 

       for (int i = 0; i < d_nodes.length; i++){

           //标记为文本内容

           String d_biaoshi = "T:";

           Node d_anode = (Node) d_nodes[i];

           String d_line = "";                   

           if (d_anode instanceof TextNode){

              TextNode d_textnode = (TextNode) d_anode;

              d_line = d_textnode.getText();

           }else if (d_anode instanceof LinkTag){

              LinkTag d_linknode = (LinkTag) d_anode;

              d_line = d_linknode.getLink();

              //标记为链接内容

              d_biaoshi = "L:";                 

}                         if(d_line==null||"".equals(d_line.trim()))continue;

d_line=d_line.replaceAll("/n","").replaceAll("/t","").trim();

       list.add(d_biaoshi+d_line);

       }

       for(int j = 0 ;j<list.size();j++){

           String temp = (String)list.get(j);

           //链接前面的说明是表头信息,从链接开始要提取的内容

           if (temp.startsWith("L:")){                     

              User user = new User();

              user.setHref(temp.substring(2));

              //链接的下一个是名字

              j++;

              temp = (String)list.get(j);                  

              //设置名称

              user.setName(temp.substring(2));

              //名字的下一个是所属公司

              j++;

              temp = (String)list.get(j);                         

              user.setCompany(temp.substring(2));   

              userlist.add(user);

           }                   

       }          //-------------------------------------------------------          //打印出所有的用户相关信息

       for(int i = 0 ;i <userlist.size();i++){

           User user = userlist.get(i);

           System.out.println("======用户名======="+user.getName());

           System.out.println("=======链接======"+user.getHref());

           System.out.println("=======公司======"+user.getCompany());

           System.out.println("-------------------------------");

       }

    }

} catch (Exception e) {

    e.printStackTrace();

}

return userlist;

}

打印结果为:

======用户名=======test1

=======链接======http://test1.com

=======公司======test1公司

--------------------------------------------------------

======用户名=======test2

=======链接======http://test2.com

=======公司======test2公司

 

 

以上是我在项目中用的HtmlParser的用法,另外还在网上找了一些其它的用法,大体思路都是类似的。有一些其它的例子可以参考:

http://j2ee.blog.sohu.com/37474805.html

http://gcgmh.javaeye.com/blog/474093

 

你可能感兴趣的:(html,exception,String,user,filter,table)