Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4403392
  • 博文数量: 291
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 7924
  • 用 户 组: 普通用户
  • 注册时间: 2016-07-06 14:28
  • 认证徽章:
个人简介

阿里巴巴是个快乐的青年

文章分类

全部博文(291)

文章存档

2018年(21)

2017年(4)

2016年(5)

2015年(17)

2014年(68)

2013年(174)

2012年(2)

分类: 架构设计与优化

2014-08-11 00:06:43

一、简介
        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(http://www.mozilla.org)的模式。因此你应当尝试去解析那些由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结合可以很好地实现网页抓取和解析。


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

scq2099yt2014-08-11 00:06:56

文明上网,理性发言...

评论热议
请登录后评论。

登录 注册