code2012

加油,坚持,努力,自信
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

vs2010环境 c++ 使用htmlcxx解析html .转

Posted on 2012-12-10 20:32  code2012  阅读(9190)  评论(0编辑  收藏  举报

vs2010环境 c++ 使用htmlcxx解析html

from http://blog.csdn.net/q408384053/article/details/8070627

 

因为最近在弄一个获取课表的程序,课表的内容来自教务系统网站,所以需要解析html。然后我就在网上搜索”c++解析html“,然后就找到了htmlcxx这个开源库,下载下来,发现不会使用它,然后又在网站上搜索相关资料。最后找到一个博客(http://www.cnblogs.com/zhanglanyun/),然后用email联系了他,解决了问题,很感谢他!

接着说如何使用(作为参考,可能在别人的电脑上和我这有些区别):

1.下载htmlcxx库,我下的是tar.gz格式的,然后用解压软件将它解压出来。

2.找到一个vs的工程文件htmlcxx.vcproj(旧版本的vs工程),打开打,直接编译可能会提示有一个错误(因为在我电脑里出现了),错误指向了一个常字符指针(const char *),如下图,然后只需要把后面的引号删掉,重新打一次,再编译,就可以成功编译了。

3.编译完成之后,工程生成了一个lib静态库文件。

4.但是这个库下载下来是不支持中文的,也就是说比如html中标签里含有中文,就会出错(这是我在获取源代码时,因为获取不完全,导致程序出错,才发现的)。如果出现了这个问题,可以查看以下两个博客,里面有解决方法。

http://my.oschina.net/leeeryan/blog/9914

http://blog.csdn.net/schoolers/article/details/6891061

5.然后在你的工程里面设置vc的包含目录和库目录,把htmlcxx文件夹包含,然后库目录包含刚才生成的lib的文件夹。另外,也可以将刚生成的lib拷贝到你的工程目录下,用#pragma (lib, "xxxx.lib")加载静态链接库。

6.接着,在 工程属性->c/c++->代码生成 里面将运行库设置为/MTd。

这就可以使用了。

如何使用呢?

以控制台为例

1.#include <htmlcxx/html/ParserDom.h>

2. #include <htmlcxx/html/utils.h>

3.使用命名空间,using namespace htmlcxx

4.

  1. HTML::ParserDom parser ;        //可以用来将html代码转换成dom树   
  2. tree<HTML::Node> dom ;            //用来储存html各个节点   
  3. tree<HTML::Node>::iterator iterator ; //树的迭代器   
  4.   
  5. iterator = dom.begin () ;               //得到dom的第一个节点   
  6. iterator->tagName () ;                  //获得节点的标签名   
  7. iterator->parserAttributes () ;         //附上节点属性   
  8. iterator->Attribute ("href").second ;   //此行执行需要上行,这相当于获取标签的href属性,之所以有second,因为Attribute ("attributeName")返回了一个pair  
HTML::ParserDom parser ;		//可以用来将html代码转换成dom树
tree<HTML::Node> dom ;			//用来储存html各个节点
tree<HTML::Node>::iterator iterator ;	//树的迭代器

iterator = dom.begin () ;               //得到dom的第一个节点
iterator->tagName () ;                  //获得节点的标签名
iterator->parserAttributes () ;         //附上节点属性
iterator->Attribute ("href").second ;   //此行执行需要上行,这相当于获取标签的href属性,之所以有second,因为Attribute ("attributeName")返回了一个pair

在博客记录一下,方便以后使用。若有说的不对的地方,欢迎指出。