一、简介
htmlcxx是一款简洁的,非验证式的,用C++编写的css1和html解析器。和其他的几款Html解析器相比,它具有以下的几个特点:
(1)使用由KasperPeeters编写的强大的tree.h库文件,可以实现类似STL的DOM树遍历和导航。
(2)可以通过解析后生成的树,逐字节地重新生成原始文档。
(3)打包好的Css解析器。
(4)额外的属性解析功能
(5)看似很像C++代码的C++代码(其实已不再是C++了)
(6)原始文档中的tags/elements的偏移值都存储在DOM树的节点当中。
htmlcxx的解析策略其实是尝试模仿mozilla firefox()的模式。因此你应当尝试去解析那些由firefox所生成的文档。然而不同于firefox浏览器,htmlcxx并不会将一些原本不存在的东西加入到所生成的文档当中去。因此,在将生成树进行序列化的时候,能够完全地还原和原始Byte大小一样的HTML文档。
这是htmlcxx简要介绍,我的理解作为页面解析丝毫没有问题,更多介绍请参看,也可以参看
这里。
二、编译
这里以CentOS 6.2下使用最新版本htmlcxx-0.85.tar.gz为例说明之,可以从下载源码。
htmlcxx的编译和安装都很简单,解压后执行如下指令即可:
#./configure
#make
#make install
默认lib安装在/usr/lib下,css和html头文件安装在/usr/local/include/htmlcxx下。
三、使用
这里以一个小例子说明如下解析html文档,源码如下:
#vi main.cpp
#include
#include
#include
#include
#include
#include
#include
using namespace std;
using namespace htmlcxx;
int main()
{
//待解析的一段html代码
string html ="hey
";
HTML::ParserDom parser;
tree dom = parser.parseTree(html);
//输出整棵DOM树
cout<< dom << endl;
//输出树中所有的超链接节点
tree::iterator it = dom.begin();
tree::iterator end = dom.end();
for(; it != end; ++it)
{
if (strcasecmp(it->tagName().c_str(), "A") == 0)
{
it->parseAttributes();
cout <attribute("href").second << endl;
}
}
//输出所有的文本节点
it= dom.begin();
end= dom.end();
for(; it != end; ++it)
{
if ((!it->isTag()) && (!it->isComment()))
{
cout << it->text();
}
}
cout << endl;
}
#gcc -o main main.cpp -Iusr/include/htmlcxx -lhtmlcxx
#./main
-----
0@[0;29)
1@[0;29) html
2@[6;22) body
3@[12;15) hey
-----
hey
附注:htmlcxx和libcurl结合可以很好地实现网页抓取和解析。
阅读(927) | 评论(0) | 转发(0) |