libtidy是一个开源的用来诊断,分析,生成html文档的一个库
下面的例子是使用libtidy获取页面链接的例子
代码如下:
#ifndef PARSEPAGE_HPP
#define  PARFSPAGE_HPP
#include 
< string >
#include 
< vector >
#include 
< tidy / buffio.h >
#include 
< tidy / fileio.h >
#include 
< tidy / tidy.h >
#include 
< tidy / tidyenum.h >
#include 
< tidy / platform.h >

// ! 解析html页面 
class  ParsePage
{
public :
    typedef std::vector
< std:: string >  String;
public :
    ParsePage(
int  rank  =   0 , const  std:: string &  cur  =   "" ):rank(rank),cur(cur)
    {
        doc 
=  tidyCreate();
        root 
=  tidyGetRoot(doc);
    }
    
~ ParsePage()
    {
        tidyRelease(doc);
    }
public :
    
// ! 解析给定文件
     bool  LoadFile( const   char *  file)
    {    
        
return   1   ==  tidyParseFile(doc,file);
    }
    
// !解析给定内存
     bool  LoadBuffer( const   char *  buffer)
    {   
        
return   1   ==  tidyParseString(doc,buffer);
    }
    
// ! 内容解析
     void  Check()
    {   
        CheckHref(root);
    }
    
// ! 获取链接
     int  GetLinkNumber() const { return  links.size();}
    std::
string  GetLinkByIndex( int  index){ return  links.at(index);} 
private :
    
void  DoHref(TidyAttr attr);
    
void  CheckHref(TidyNode node);
private :
    TidyDoc     doc;
    TidyNode    root;
    std::
string  cur;
    
int          rank;
    String      links;
};

#endif
// ! ccsdu2004
实现:
#include  < boost / algorithm / string .hpp >
#include 
" parsepage.hpp "

void  ParsePage::DoHref(TidyAttr attr)
{
    std::
string  href(tidyAttrValue(attr));
    
// ! 邮箱地址
     if (boost::algorithm::starts_with(href, " mailto: " ))
    {
    }
    
// ! 链接地址
     else
    {
        
if (boost::algorithm::starts_with(href, " http: " ))
        {
            size_t itr 
=  href.find_last_of( ' # ' );
            
if (itr  !=  std:: string ::npos)
            {
                href 
=  href.substr( 0 ,itr);
            }
        }
        
else
        {   
            
if (boost::algorithm::contains(href, " # " ))
                
return ;
        }
    
        links.push_back(href);
    }
}

void  ParsePage::CheckHref(TidyNode node)
{
    TidyNode child;
    
for (child  =  tidyGetChild(node);child;child  =  tidyGetNext(child))
    {
        TidyAttr attr 
=  tidyAttrGetHREF(child);
        
if (attr)
        {
            DoHref(attr);
        }
        CheckHref(child);
    }
}
这个对象比较简单
调用Check之后所有的页面链接在links中