htmlparser使用

下载地址http://sourceforge.net/projects/htmlparser/ 

在线APIhttp://www.ostools.net/apidocs/apidoc?api=HTMLParser

HTMLParser的核心模块是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;
    
和一个静态类 public static Parser createParser (String html, String charset);

    
对于大多数使用者来说,使用最多的是通过一个 URLConnection 或者一个保存有网页内容的字符串来初始化 Parser ,或者使用静态函数来生成一个 Parser 对象。 ParserFeedback 的代码很简单, 是针对调试和跟踪分析过程的 ,一般不需要改变。 而使用 Lexer 则是一个相对比较高级的话题 ,放到以后再讨论吧。

    这里比较有趣的一点是,如果需要设置页面的编码方式的话,不使用Lexer就只有静态函数一个方法了。对于大多数中文页面来说,好像这是应该用得比较多的一个方法。


Node中包含的方法有几类:
对于树型结构进行遍历的函数,这些函数最容易理解:
Node 
getParent ()取得父节点
NodeList 
getChildren ()取得子节点的列表
Node 
getFirstChild ()取得第一个子节点
Node 
getLastChild ()取得最后一个子节点
Node 
getPreviousSibling ()取得前一个兄弟(不好意思,英文是兄弟姐妹,直译太麻烦而且不符合习惯,对不起女同胞了)
Node 
getNextSibling ()取得下一个兄弟节点
取得Node内容的函数
String 
getText ()取得文本
String 
toPlainTextString()取得纯文本信息
String 
toHtml () 取得HTML信息(原始HTML
String 
toHtml (boolean verbatim)取得HTML信息(原始HTML
String 
toString ()取得字符串信息(原始HTML
Page 
getPage ()取得这个Node对应的Page对象
int 
getStartPosition ()取得这个NodeHTML页面中的起始位置
int 
getEndPosition ()取得这个NodeHTML页面中的结束位置
用于Filter过滤的函数:
顾名思义,Filter就是对于结果进行过滤,取得需要的内容。HTMLParser在org.htmlparser.filters包之内一共定义了16个不同的Filter,也可以分为几类。
判断类Filter:

TagNameFilter
HasAttributeFilter
HasChildFilter
HasParentFilter
HasSiblingFilter
IsEqualFilter

逻辑运算Filter:
AndFilter
NotFilter
OrFilter
XorFilter
其他Filter:
NodeClassFilter
StringFilter
LinkStringFilter
LinkRegexFilter
RegexFilter
CssSelectorNodeFilter

tag:

ImageTag

TagNameFilter

FormTag 

TableTag 

BodyTag 

HeadTag 

InputTag 

LinkTag 

ScriptTag 

StyleTag 

TitleTag
所有的Filter类都实现了org.htmlparser.NodeFilter接口。这个接口只有一个主要函数:
boolean accept (Node node);
各个子类分别实现这个函数,用于判断输入的Node是否符合这个Filter的过滤条件,如果符合,返回true,否则返回false。

用于Visitor遍历的函数:
void 
accept (NodeVisitor visitor)对这个Node应用visitor
用于修改内容的函数,这类用得比较少
void 
setPage (Page page)设置这个Node对应的Page对象
void 
setText (String text)设置文本
void 
setChildren (NodeList children)设置子节点列表
其他函数
void 
doSemanticAction ()执行这个Node对应的操作(只有少数Tag有对应的操作)
Object 
clone ()接口Clone的抽象函数。


htmlparser是一个纯的java写的html解析的库,它不依赖于其它的java库文件,主要用于改造或提取html。它能超高速解析html,而且不会出错。现在htmlparser最新版本为2.0


Filter就是对于结果进行过滤,取得需要的内容。HTMLParserorg.htmlparser.filters包之内一共定义了15个不同的Filter

AndFilter、CssSelectorNodeFilter、HasAttributeFilter、HasChildFilter、HasSiblingFilter、IsEqualFilter、LinkRegexFilter、LinkStringFilter、NodeClassFilter、NotFilter、OrFilter、RegexFilter、StringFilter 、TagNameFilter.

实例应用

NodeClassFilter过滤器实例

    /**
     * 
     * 过滤页面中的标签信息
     * 
     * @param url        要解析的url页面
     * @param encoding    使用的字符编码
     * @param tagclass    
     *                     要或取得页面标签,如要获取页面中的超链接 值为LinkTag.class,要获取页面中图片链接,值为ImageTag.class
     *                     要传入的标签类为org.htmlparser.tags下的
     */
    public static void nodeFilterTagClass(String url,String encoding,Class tagclass){
        try {
            Parser parser = new Parser();
            parser.setURL(url);
            if(null==encoding){
                parser.setEncoding(parser.getEncoding());
            }else{
                parser.setEncoding(encoding);
            }
            //过滤页面中的链接标签
            NodeFilter filter = new NodeClassFilter(tagclass);
            NodeList list = parser.extractAllNodesThatMatch(filter);
            for(int i=0; i<list.size();i++){
                Node node = (Node)list.elementAt(i);
                System.out.println("link is :" + node.toHtml());
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        
        String url = "http://wenku.baidu.com/search?word=htmlparser&lm=0&od=0&fr=top_home";
        
        //获取页面中的<a href='xxx' [属性]>格式的链接
        nodeFilterTagClass(url, "UTF-8", LinkTag.class);
    
        //或取页面中的<img src='xxx' [属性='属性值']>格式的链接
        nodeFilterTagClass(url, "UTF-8", ImageTag.class);
        
        //或取页面<title>xxxx</title>标题
        nodeFilterTagClass(url, "UTF-8", TitleTag.class);
        
        //获取页面<div [属性='属性值']> xxx</div>
        //nodeFilterTagClass(url, "UTF-8", Div.class);

}

程序运行结果:



TagNameFilter实例应用
是最容易理解的一个Filter,根据Tag的名字进行过滤

    /**
     * 
     * 根据标签名过滤页面中的标签信息
     * 
     * @param url        要解析的url页面
     * @param encoding    使用的字符编码
     * @param tagName    标签名
     */
    public static void nodeFilterTagName(String url,String encoding,String tagName){
        try {
            Parser parser = new Parser();
            parser.setURL(url);
            if(null==encoding){
                parser.setEncoding(parser.getEncoding());
            }else{
                parser.setEncoding(encoding);
            }
            //过滤页面中的链接标签
            NodeFilter filter = new TagNameFilter(tagName);
            NodeList list = parser.extractAllNodesThatMatch(filter);
            for(int i=0; i<list.size();i++){
                Node node = (Node)list.elementAt(i);
                System.out.println("link is :" + node.toHtml());
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        
        String url = "http://wenku.baidu.com/search?word=htmlparser&lm=0&od=0&fr=top_home";
        
        //获取页面中的<a href='xxx' [属性]>格式的链接
        nodeFilterTagName(url, "UTF-8", "a");
        
        //或取页面中的<img src='xxx' [属性='属性值']>格式的链接
        nodeFilterTagName(url, "UTF-8", "img");
        
        //获取页面中的<div>链接
        //nodeFilterTagName(url, "UTF-8", "div");
        
    }

程序运行结果同上

StringFilter实例应用
过滤显示字符串中包含指定内容的标签节点。注意是可显示的字符串,不可显示的字符串中的内容(例如注释,链接等等)不会被显示

    /**
     * 过滤显示字符串中包含指定内容的标签节点。注意是可显示的字符串,不可显示的字符串中的内容(例如注释,链接等等)不会被显示
     * 
     * @param url        请求处理的url
     * @param encoding    字符编码
     * @param containStr包含的指定内容
     */
    public static void stringFilter(String url,String encoding,String containStr){
        try {
            Parser parser = new Parser();
            parser.setURL(url);
            if(null==encoding){
                parser.setEncoding(parser.getEncoding());
            }else{
                parser.setEncoding(encoding);
            }
            //OrFilter是结合几种过滤条件的‘或’过滤器
            NodeFilter filter = new StringFilter(containStr);
            NodeList list = parser.extractAllNodesThatMatch(filter);
            for(int i=0; i<list.size();i++){
                Node node = (Node)list.elementAt(i);
                System.out.println("link is :" + node.toHtml());
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        
        String url = "http://wenku.baidu.com/search?word=htmlparser&lm=0&od=0&fr=top_home";
        stringFilter(url, "UTF-8", "img.baidu.com");
        
    }

程序运行结果




OrFilter实例应用
OrFilter是结合几种过滤条件的‘或’过滤器,与此相反的是AndFilter,AndFilter是集合几个过滤条件的‘与’过滤器

    /**
     * OrFilter是结合几种过滤条件的‘或’过滤器
     * 
     * 一般主题信息包含在下列标签中:<table>、<tr>、<td>、<p>、<div>等。如果要过滤出这些节点标签,可以使用OrFilter过滤器
     * 
     * @param url        请求处理的url
     * @param encoding    使用的字符编码
     * @param filters    多个过滤器数组
     */
    public static void orMultiFilter(String url,String encoding,NodeFilter[] filters){
        try {
            Parser parser = new Parser();
            parser.setURL(url);
            if(null==encoding){
                parser.setEncoding(parser.getEncoding());
            }else{
                parser.setEncoding(encoding);
            }
            //OrFilter是结合几种过滤条件的‘或’过滤器
            NodeFilter filter = new OrFilter(filters);
            NodeList list = parser.extractAllNodesThatMatch(filter);
            for(int i=0; i<list.size();i++){
                Node node = (Node)list.elementAt(i);
                System.out.println("link is :" + node.toHtml());
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
        
    public static void main(String[] args) {
        
        String url = "http://wenku.baidu.com/search?word=htmlparser&lm=0&od=0&fr=top_home";
        //过滤多个标签 或关系
        NodeFilter[]  filters = new NodeFilter[3];
        filters[0] = new NodeClassFilter(TableTag.class); 
        filters[1] = new NodeClassFilter(ParagraphTag.class);
        filters[2] = new NodeClassFilter(ImageTag.class);
        orMultiFilter(url, "UTF-8", filters);
                
    }

程序运行结果:




RegexFilter与LinkRegexFilter实例应用
RegexFilter根据正则表达式匹配节点.与LinkRegexFilter不同的是,LinkRegexFilter只在LinkTag中寻找匹配

    /**
     * 在文本中通过正则进行匹配
     * 
     * @param url        请求处理的url
     * @param encoding    字符编码
     * @param regex        待匹配的正则表达式
     */
    public static void regexStringFilter(String url,String encoding,String regex){
        try {
            Parser parser = new Parser();
            parser.setURL(url);
            if(null==encoding){
                parser.setEncoding(parser.getEncoding());
            }else{
                parser.setEncoding(encoding);
            }
            //OrFilter是结合几种过滤条件的‘或’过滤器
            NodeFilter filter = new RegexFilter(regex);
            NodeList list = parser.extractAllNodesThatMatch(filter);
            for(int i=0; i<list.size();i++){
                Node node = (Node)list.elementAt(i);
                System.out.println("link is :" + node.toHtml());
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 在链接地址中进行正则匹配,返回的是Link结点
     * 
     * @param url        请求url
     * @param encoding    字符编码
     * @param regex        待匹配的正则表达式
     */
    public static void linkTagRegexFilter(String url,String encoding,String regex){
        try {
            Parser parser = new Parser();
            parser.setURL(url);
            if(null==encoding){
                parser.setEncoding(parser.getEncoding());
            }else{
                parser.setEncoding(encoding);
            }
            //OrFilter是结合几种过滤条件的‘或’过滤器
            NodeFilter filter = new LinkRegexFilter(regex);
            NodeList list = parser.extractAllNodesThatMatch(filter);
            for(int i=0; i<list.size();i++){
                Node node = (Node)list.elementAt(i);
                System.out.println("link is :" + node.toHtml());
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
        
        String url =  "F:/dennisit/email.txt";

        String emailRegex = "[a-zA-Z0-9_-]+@\\w+\\.[a-z]+(\\.[a-z]+)?";  
        regexStringFilter(url, "UTF-8", emailRegex);
        System.out.println("-------------------------------------------");
        linkTagRegexFilter(url, "UTF-8", emailRegex);
        
    }

程序运行结果


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值