libtidy是一个开源的用来诊断,分析,生成html文档的一个库
下面的例子是使用libtidy获取页面链接的例子
代码如下:
调用Check之后所有的页面链接在links中
下面的例子是使用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
实现:
#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);
}
}
这个对象比较简单
#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中