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);
}
//!解析給定內(nèi)存
bool LoadBuffer(const char* buffer)
{
return 1 == tidyParseString(doc,buffer);
}
//! 內(nèi)容解析
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
實現(xiàn):
#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);
}
}
這個對象比較簡單
調(diào)用Check之后所有的頁面鏈接在links中