您的位置:首页 > Web前端 > HTML

使用libtidy解析html文档的小例子一个

2012-02-13 14:57 387 查看
#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


libtidy是一个开源的用来诊断,分析,生成html文档的一个库

下面的例子是使用libtidy获取页面链接的例子

代码如下:

#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中
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: