Cpper
C/C++高级工程师 Android高级软件工程师 IT集成工程师 音频工程师 熟悉c,c++,java,c#,py,js,asp等多种语言 程序猿
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中

posted on 2011-03-11 19:29 ccsdu2009 阅读(1667) 评论(0)  编辑 收藏 引用 所属分类: 杂项

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理