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中