HTMLParser学习笔记(一)

转载 http://www.cnblogs.com/dlutxm/archive/2011/12/13/2286862.html  

最近一直在学习搜索引擎的相关知识,在对于原始的HTML网页的处理是其中非常重要的一个环节,也就是所说的“去噪”,比如去掉相关的标签和不需要的JS代码等等,HTMLParser(http://htmlparser.sourceforge.net/)是一个对现有的HTML进行分析的快速实时的解析工具。它是一个开源的项目,通过它可以准确高效地对HTML文本中的格式、数据进行处理。利用它可以很容易地对网页的内容进行分析、过滤和抓取。它的主要功能分为以下几个部分:

      文本信息抽取:提取网页中的文字。

      链接提取:提取网页中的链接信息和锚文本。

      资源提取:网页中图片、声音的处理。

      链接检查:用于检查HTML中的链接是否有效。

      内容检查:可以用来过滤网页上一些令人不愉快的字词。

     HTMLParser最核心的模块是Parser类,这个类实际完成了对于HTML页面的分析工作,构造函数如下:

     public Parser ();     API链接地址:http://htmlparser.sourceforge.net/javadoc/index.html
     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对象。

     下面我们给出两个简单的初始化的例子。

 1.下面是通过传递保存有网页内容的字符串来初始化Parser和通过Parser静态函数来生成Parser对象

?
import  java.io.BufferedReader;
import  java.io.ByteArrayInputStream;
import  java.io.File;
import  java.io.FileInputStream;
import  java.io.FileNotFoundException;
import  java.io.FileOutputStream;
import  java.io.FileReader;
import  java.io.FileWriter;
import  java.io.IOException;
import  java.io.InputStreamReader;
import  java.io.UnsupportedEncodingException;
import  java.util.HashMap;
import  java.util.Map;
import  java.util.StringTokenizer;
import  java.util.regex.Matcher;
import  java.util.regex.Pattern;
 
import  javax.swing.plaf.metal.MetalFileChooserUI;
 
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.nodes.TextNode;
import  org.htmlparser.tags.JspTag;
import  org.htmlparser.tags.LinkTag;
import  org.htmlparser.tags.MetaTag;
import  org.htmlparser.tags.TableTag;
import  org.htmlparser.tags.TitleTag;
import  org.htmlparser.util.NodeList;
import  org.htmlparser.util.ParserException;
 
 
public  class  t {
 
     /**
      * @param args
      * @throws IOException
      */
     public  final  static  String testFilePath= "C:" +File.separator+ "glose - 博客园.htm" ;
     public  final  static  String urlName= "http://www.cnblogs.com/dlutxm/" ;
     public  static  String readFile(String fileName) throws  IOException{           //读本地文件内容
         FileInputStream fin= new  FileInputStream(fileName);
         InputStreamReader inReader= new  InputStreamReader(fin, "utf-8" );
         BufferedReader bReader= new  BufferedReader(inReader);
         StringBuffer content= new  StringBuffer();
         String line= null ;
         while ((line=bReader.readLine())!= null ){
             content.append(line);
             content.append( "\n" );
         }
         bReader.close();
         inReader.close();
         fin.close();
         //System.out.println(content);
         return  content.toString();
     }
     public  static  void  parser(String content) throws  ParserException{
         Parser parser=Parser.createParser(content, "utf-8" );
     //Parser parser=new Parser(content);
         NodeList nodeList= null ;
         
         //  注册特定标签的类  或者说某个特定的节点
         NodeFilter titleFilter= new  NodeClassFilter(TitleTag. class );
         NodeFilter metaFilter= new  NodeClassFilter(MetaTag. class );
         NodeFilter textFilter= new  NodeClassFilter(TextNode. class );
         NodeFilter tableFilter= new  NodeClassFilter(TableTag. class );
         NodeFilter linkFilter= new  NodeClassFilter(LinkTag. class );
         NodeFilter jspFilter= new  NodeClassFilter(JspTag. class );
         
         
         //OrFilter类可以得到其参数中设置的任何节点类型,节点之间是或的关系  具体实现方法为setPredicates()
         OrFilter lastFilter= new  OrFilter();
         lastFilter.setPredicates( new  NodeFilter[]{titleFilter,metaFilter,textFilter,tableFilter,linkFilter,jspFilter});
         
         nodeList=parser.parse(lastFilter);
         
         Node [] nodes=nodeList.toNodeArray();
         String line= "" ;
         for ( int  i= 0 ;i<nodes.length;i++){
             Node node=nodes[i];
             if (node instanceof  TitleTag){   //得到网页的标题
                 TitleTag titlenode=(TitleTag)node;
                 line=titlenode.getTitle();
                 //System.out.println(line);
             }
             else  if (node instanceof  MetaTag) { //得到meta中的content内容,包括网页的关键字、编码、描述信息等。
                 MetaTag metaTag=(MetaTag)node;
                 line=metaTag.getAttribute( "content" ); 
                 //System.out.println(line);
             }
             
             else  if (node instanceof  TextNode){  //得到文本内容
                 TextNode textNode=(TextNode)node;
                 line=textNode.getText();
                 //System.out.println(line);
             }
             else  if (node instanceof  TableTag){  
                 TableTag tableTag=(TableTag)node;
                 line=tableTag.toPlainTextString();   //得到表格的内容
                 //System.out.println(line);
                 String width=tableTag.getAttribute( "width" );
                 String height=tableTag.getAttribute( "height" );
                 //System.out.println(width);
             }
             else  if (node instanceof  LinkTag){    //得到网页中的链接和链接文本
                 LinkTag linknode=(LinkTag)node;
                 String linkText=linknode.getLinkText();
                 String link=linknode.getLink();
                 
                 System.out.println(linkText);
                 System.out.println(link);
             }
             else  if (node instanceof  JspTag){   //解析网页中的Javas,ASP等动态的代码
                 JspTag jspTag=(JspTag)node;
                 line=jspTag.toString();
                 System.out.println(line);
             }
             
         }
             
     }
     public  static  void  main(String[] args) throws  IOException, ParserException {
         // TODO Auto-generated method stub
         String content=readFile(testFilePath);
         parser(content);
     }
 
}

  

2.下面是通过一个URLConnection来初始化Parser

 

?
import  java.io.IOException;
import  java.net.HttpURLConnection;
import  java.net.MalformedURLException;
import  java.net.URL;
 
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.TitleTag;
import  org.htmlparser.util.NodeList;
import  org.htmlparser.util.ParserException;
 
 
public  class  urlTest {
 
     /**
      * @param args
      * @throws IOException
      * @throws MalformedURLException
      * @throws ParserException
      */
     public  static  void  parser(String url) throws  MalformedURLException, IOException, ParserException{
         HttpURLConnection urlConnection=(HttpURLConnection) ( new  URL(url)).openConnection();
         Parser parser= new  Parser(urlConnection);
         NodeFilter titleFilter= new  NodeClassFilter(TitleTag. class );
         NodeList nodeList= null ;
         OrFilter lasFilter= new  OrFilter();
         lasFilter.setPredicates( new  NodeFilter[]{titleFilter});
         nodeList=parser.parse(lasFilter);
         Node []nodes=nodeList.toNodeArray();
         for ( int  i= 0 ;i<nodes.length;i++){
             if (nodes[i] instanceof  TitleTag){
                 TitleTag titleTag=(TitleTag)nodes[i];
                 String title=titleTag.getTitle();
                 System.out.println(title);
             }
         }
         
     }
     public  static  void  main(String[] args) throws  MalformedURLException, ParserException, IOException {
         // TODO Auto-generated method stub
         String url= "http://www.baidu.com" ;
         parser(url);
     }
 
}

 3.下面是对相关的Parser对象构造函数进行了很好的封装和测试。常用的构造Parser对象的方法有以下几种:

?
import  java.io.IOException;
import  java.net.HttpURLConnection;
import  java.net.MalformedURLException;
import  java.net.URL;
 
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.http.ConnectionManager;
import  org.htmlparser.lexer.Page;
import  org.htmlparser.tags.TitleTag;
import  org.htmlparser.util.NodeList;
import  org.htmlparser.util.ParserException;
 
 
public  class  IteratorNode {
 
     /**
      * @param args
      */
     public  static  Parser getParserWithUrlStr(String urlStr,String encoding) throws  ParserException{
         Parser parser= new  Parser();
         parser.setURL(urlStr);
         parser.setEncoding(encoding);
         return  parser;
     }
     public  static  Parser getParserWithUrlConn(String urlStr,String encoding) throws  IOException, ParserException{
         URL url= new  URL(urlStr);
         HttpURLConnection urlConnection=(HttpURLConnection) url.openConnection();
         Parser parser= new  Parser(urlConnection);
         parser.setEncoding(encoding);
         return  parser;
     }
     public  static  Parser getParserWithUrlConn2(String urlStr,String encoding) throws  ParserException{
         ConnectionManager manager=Page.getConnectionManager();
         Parser parser= new  Parser(manager.openConnection(urlStr));
         parser.setEncoding(encoding);
         return  parser;
     }
     public  static  Parser createParser(String htmlContent,String encoding){   //读取本地文件
         Parser parser=Parser.createParser(htmlContent, encoding);
         return  parser;
     }
     public  static  void  main(String[] args) throws  ParserException, IOException {
         // TODO Auto-generated method stub
         Parser parser1=getParserWithUrlStr( "http://www.baidu.com" , "utf-8" );
         Parser parser2=getParserWithUrlConn( "http://www.baidu.com" , "utf-8" );
         Parser parser=getParserWithUrlConn2( "http://www.baidu.com" , "utf-8" );
         NodeFilter titleFilter= new  NodeClassFilter(TitleTag. class );
         NodeList nodeList= null ;
         OrFilter lasFilter= new  OrFilter();
         lasFilter.setPredicates( new  NodeFilter[]{titleFilter});
         nodeList=parser.parse(lasFilter);
         Node []nodes=nodeList.toNodeArray();
         for ( int  i= 0 ;i<nodes.length;i++){
             if (nodes[i] instanceof  TitleTag){
                 TitleTag titleTag=(TitleTag)nodes[i];
                 String title=titleTag.getTitle();
                 System.out.println(title);
             }
         }
         
     }
 
}

你可能感兴趣的:(HtmlParser)