Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6086622
  • 博文数量: 2759
  • 博客积分: 1021
  • 博客等级: 中士
  • 技术积分: 4091
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-11 14:14
文章分类

全部博文(2759)

文章存档

2019年(1)

2017年(84)

2016年(196)

2015年(204)

2014年(636)

2013年(1176)

2012年(463)

分类: 架构设计与优化

2014-08-12 09:53:36

一、简介
        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结合可以很好地实现网页抓取和解析。


阅读(845) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~