JAVA HtmlParser Filter解析网页和表格(半个教程)

本文介绍了使用Java和HTML解析库解析HTML页面的过程,包括页面初始化、获取节点内容及访问网页元素的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package sometry;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.FileInputStream;
import java.io.File;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import org.htmlparser.filters.AndFilter;
import org.htmlparser.filters.HasAttributeFilter;
import org.htmlparser.filters.HasChildFilter;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.nodes.TagNode;
import org.htmlparser.tags.TableColumn;
import org.htmlparser.tags.TableHeader;
import org.htmlparser.tags.TableRow;
import org.htmlparser.tags.TableTag;
import org.htmlparser.util.NodeIterator;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
import org.htmlparser.visitors.TextExtractingVisitor;
import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;



public class InitializeParser {

   public static void main(String[] args) {
        
        String szContent = openFile( "http://www.cb.cityu.edu.hk/is/people/academic/");
        
        try{
        	/*
        	 * 第一部分            介绍Parser类的初始化
        	 * 
        	    org.htmlparser.Parser类用来解析HTML页面,共有以下几个构造函数:
        	    public Parser ();
        	    public Parser (Lexer lexer, ParserFeedback fb);
        		public Parser (URLConnection connection, ParserFeedback fb) throws ParserException;
        	    public Parser (String resource, ParserFeedback feedback) throws ParserException;
        		public Parser (String resource) throws ParserException;
        	    public Parser (Lexer lexer);
        	    public Parser (URLConnection connection) throws ParserException;
        		常用的是通过一个URLConnection或者一个保存有网页内容的字符串来初始化Parser
        	 */
        	
        	/*-------第一种初始化方式  Parser.createParser(String html, String charset) --------------*/
//        	szContent="<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=gb2312\"><title>白泽居-www.baizeju.com</title></head><html xmlns=\"http://www.w3.org/1999/xhtml\"><body ><div id=\"top_main\">    <div id=\"logoindex\">        <!--这是注释-->        白泽居-www.baizeju.com<a href=\"http://www.baizeju.com\">白泽居-www.baizeju.com</a>    </div> 白泽居-www.baizeju.com</div></body></html>";
//            Parser parser = Parser.createParser(szContent, "GBK");
  
        	/*-------第二种初始化方式 -使用HttpURLConnection-------------*/
//            Parser parser = new Parser( (HttpURLConnection) (new URL("http://www.cb.cityu.edu.hk/staff/issliao/")).openConnection() );
           /*------第三种初始化方式(也是我比较倾向于使用的方式)------*/
            Parser parser = new Parser();  
            parser.setURL("http://www.cb.cityu.edu.hk/staff/issliao/");  
            parser.setEncoding(parser.getEncoding());
            
            /*第二部分     
             * 主要获得页面中的Node,进而得到Node中的内容
             * 
             * 
             *Node中包含的方法有几类:
             *对于树型结构进行遍历的函数,这些函数最容易理解:
             *Node getParent ():取得父节点
             *NodeList getChildren ():取得子节点的列表
             *Node getFirstChild ():取得第一个子节点
             *Node getLastChild ():取得最后一个子节点
             *Node getPreviousSibling ():取得前一个兄弟
             *Node getNextSibling ():取得下一个兄弟节点
             *取得Node内容的函数:
             *String getText ():取得标签上的文本  如<head id="1">MyPlace</head>其中的id="1"
             *String toPlainTextString():取得标签标出来的content, 如MyPlace
             *String toHtml () :取得HTML信息(原始HTML)
             *String toHtml (boolean verbatim):取得HTML信息(原始HTML)
             *String toString ():取得字符串信息(原始HTML)
             *Page getPage ():取得这个Node对应的Page对象
             *int getStartPosition ():取得这个Node在HTML页面中的起始位置
             *int getEndPosition ():取得这个Node在HTML页面中的结束位置
             * */
  
//             for (NodeIterator i = parser.elements (); i.hasMoreNodes(); ) {
//                Node node = i.nextNode();
//                message("getText:"+node.getText());
//                message("getPlainText:"+node.toPlainTextString());
//                message("toHtml:"+node.toHtml());
//                message("toHtml(true):"+node.toHtml(true));
//                message("toHtml(false):"+node.toHtml(false));
//                message("toString:"+node.toString());
//                message("=================================================");
//            }
           
           /*
            * 第三部分    介绍Parser来解析网页
            *Node分成三类:
            *RemarkNode:代表Html中的注释 
            *TagNode:标签节点,是种类最多的节点类型,上述Tag的具体节点类都是TagNode的实现。 
            *TextNode:文本节点 
            * 
            * */
            /*------ 主要有两种方式到达想要的Node ------*/
            /*------ 第一种 Filter  -------
             * 16个不同的Filter,也可以分为几类。
             * 判断类Filter:
             * TagNameFilter
             * HasAttributeFilter
             * HasChildFilter
             * HasParentFilter
             * HasSiblingFilter
             * IsEqualFilter
             * 逻辑运算Filter:
             * AndFilter
             * NotFilter
             * OrFilter
             * XorFilter
             * 其他Filter:
             * NodeClassFilter
             * StringFilter
             * LinkStringFilter
             * LinkRegexFilter
             * RegexFilter
             * CssSelectorNodeFilter
             * */
            /*获得节点*/
//            NodeList nodes = parser.parse(new TagNameFilter("DIV")); 
            //或者采用
//            NodeFilter filter = new TagNameFilter ("DIV");
//            NodeList nodes = parser.extractAllNodesThatMatch(filter); 
            

           /*测试HasChildFilter,返回有符合条件的子节点的节点,如下是返回有DIV节点的节点*/
//            NodeFilter innerFilter = new TagNameFilter("DIV");
//            NodeFilter filter = new HasChildFilter(innerFilter);
//            NodeList nodes = parser.extractAllNodesThatMatch(filter);
            /*测试HasAttributeFilter,把有相应属性的tag找出来*/           
//          NodeFilter filter = new HasAttributeFilter( "id","cityu-cb-staff-contact" );
//          NodeList nodes = parser.extractAllNodesThatMatch(filter);
          /*其他很多filter见http://blog.youkuaiyun.com/yanjun_xiaoli/article/details/4291865
           * */
            /*下面测试下更重要的AndFilter*/
//          NodeFilter filterID = new HasAttributeFilter( "id" );
//          NodeFilter filterChild = new HasChildFilter(innerFilter);
//          NodeFilter filter = new AndFilter(filterID, filterChild);
//          NodeList nodes = parser.extractAllNodesThatMatch(filter);
//          for(int i=0; i<nodes.size();i++){//nodes.size()  
//          TagNode node = (TagNode)nodes.elementAt(i);   
//           System.out.println("name是:" + node.getAttribute("name"));//获取tag的属性信息  
//           message("getText:"+node.getText());
//           message("toPlainTextString:"+ node.toPlainTextString());
//           message("=================================================");
//      }  
            
           /*下面是一个解析表格的例子*/
            String html = "<table>"+
			"<tbody>"+						
			"<tr>"+
				"<th>Address:</th>"+
				"<td>"+
				"P7920,  Academic 1<br>City University of Hong Kong"+
				"</td>"+
			"</tr>"+		
			"<tr>"+
				"<th>Phone:</th>"+
				"<td>+852 34427552</td>"+
			"</tr>"	+
			"<tr>"+
				"<th>Fax:</th>"+
				"<td>+852 34420370</td>"+
			"</tr>"	+	
			"<tr>"+
				"<th colspan=\"2\" style=\"white-space: nowrap;\">E-mail:</th>"+
			"</tr>"+
			"<tr>"+
				"<td colspan=\"2\"><a href=\"mailto:issliao@cityu.edu.hk\">issliao@cityu.edu.hk</a></td>"+
			"</tr>"	+			
	"</tbody>"+
"</table>";
            
            Parser parser1 = null;
            NodeList tableList = null;
            NodeFilter tableFilter = null;
            parser1 = Parser.createParser(html, "GBK");
           tableFilter = new NodeClassFilter(TableTag.class);
           tableList = parser1.extractAllNodesThatMatch(tableFilter);
           for (int i=0; i<tableList.size(); i++) {
              TableTag table = (TableTag) tableList.elementAt(i);
              //取得表中的行集
              TableRow[] rows = table.getRows();
              //遍历每行           
              for (int r=0; r<rows.length; r++) {
                  TableRow tr = rows[r];
                  //从而得到<th> tag
                  TableHeader[] headers = tr.getHeaders();
                  for (int j = 0; j < headers.length; j++) {
                	  System.out.println("tag标签为:" + headers[j].getTagName());  
                	  System.out.println("标签的内容为:" + headers[j].getStringText());
				}                                
                  //行中的列
                  TableColumn[] td = tr.getColumns();
                  for (int c=0; c<td.length; c++) {
                     System.out.print(td[c].toPlainTextString() + " ");
                  }
                  System.out.println();
              }
           }
        }
        catch( Exception e ) { 
        	e.printStackTrace();
        }
    }
	
   
   public static String openFile( String szFileName ) {
   	/*这个方法就是把整个网页内容读取下来*/
       try {
       	URL url = new URL(szFileName);
           BufferedReader bis = new BufferedReader(new InputStreamReader(url.openStream(), "GBK") );
           String szContent="";
           String szTemp;
           
           while ( (szTemp = bis.readLine()) != null) {
               szContent+=szTemp+"/n";
           }
           bis.close();
           return szContent;
       }
       catch( Exception e ) {
           return "";
       }
   }
   
   
   private static void message( String szMsg ) {
       try{ 
       	System.out.println(new String(szMsg.getBytes("GBK"), System.getProperty("file.encoding"))); 
       	} catch(Exception e ){}
   }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值