htmlcxx 解析 html 用法
2014-02-24 17:18
1146 查看
htmlcxx使用C++编写,是一个简单的非验证式的css1和html解析器。虽然你可以找到一些其它的html解析库,但htmlcxx拥有一些特色功能,使得它不管在什么地方,就好像漆黑中的萤火虫一样,是那样的鲜明,那样的出众。
基于Kasper Peeters编写的,卓越非凡的 tree.hh 库,可以实现类似STL的DOM树遍历和导航
通过解析原始文件生成的树,逐字节地,精确的生成文档
打包好的Css解析器
可选的解析属性
看似很像C++代码的C++代码
原始文档中的标签/元素偏移量,都被存储到DOM树的节点中
Htmlcxx的解析策略其实是尝试模仿mozilla firefox( http://www.mozilla.org )的模式。因此解析那些由firefox所生成的结构类似的文档非常适合。然而不同于firefox浏览器,htmlcxx并不会将一些原本不存在的东西加入到所生成的文档当中去。因此,在将生成树进行序列化的时候,能够完全地还原和原始Byte大小一样的HTML文档。
官方目前(2013-08-09)最新的版本是0.85,但下载地址( http://sourceforge.net/projects/htmlcxx/ ),确是0.84的,没有找到更新的版本了。下载tar包解压后,可以直接用vs打开它的工程htmlcxx.vcproj。
直接生成的话,会提示"\html\utils.cc(17): error C2001: 常量中有换行符"的错误(如下图)。直接打开这个文件,在第17行中的双引号之间有隐藏的换行符,在vs下不可见,将双引号删除,重新手打一遍再生成就可以通过了。
![](http://www.vipaq.com/Assets/Images/201308/13760153906028.png)
编译完之后,工程生成了一个htmlcxx.lib静态库文件。下面附上一个测试的详细例子。功能是:打开一个文件后,读取它的title内容。
![](http://www.vipaq.com/Assets/Images/201308/13760194724706.png)
![](http://www.vipaq.com/Assets/Images/201308/13760196116210.png)
![](http://www.vipaq.com/Assets/Images/201308/13760196096643.png)
![](http://www.vipaq.com/Assets/Images/201308/1376019613636.png)
在工程选项->链接->命令行最后一行加入 /NODEFAULTLIB:msvcrt.lib 禁用msvcrt.lib链接。否则会出现函数重定义。VS2005实测
测试的HTML如下:
main.cpp
基于Kasper Peeters编写的,卓越非凡的 tree.hh 库,可以实现类似STL的DOM树遍历和导航
通过解析原始文件生成的树,逐字节地,精确的生成文档
打包好的Css解析器
可选的解析属性
看似很像C++代码的C++代码
原始文档中的标签/元素偏移量,都被存储到DOM树的节点中
Htmlcxx的解析策略其实是尝试模仿mozilla firefox( http://www.mozilla.org )的模式。因此解析那些由firefox所生成的结构类似的文档非常适合。然而不同于firefox浏览器,htmlcxx并不会将一些原本不存在的东西加入到所生成的文档当中去。因此,在将生成树进行序列化的时候,能够完全地还原和原始Byte大小一样的HTML文档。
官方目前(2013-08-09)最新的版本是0.85,但下载地址( http://sourceforge.net/projects/htmlcxx/ ),确是0.84的,没有找到更新的版本了。下载tar包解压后,可以直接用vs打开它的工程htmlcxx.vcproj。
直接生成的话,会提示"\html\utils.cc(17): error C2001: 常量中有换行符"的错误(如下图)。直接打开这个文件,在第17行中的双引号之间有隐藏的换行符,在vs下不可见,将双引号删除,重新手打一遍再生成就可以通过了。
还要设置htmlcxx运行库为多线程调试 (非常重要) 否则会出现后期链接错误
![](http://www.vipaq.com/Assets/Images/201308/13760153906028.png)
编译完之后,工程生成了一个htmlcxx.lib静态库文件。下面附上一个测试的详细例子。功能是:打开一个文件后,读取它的title内容。
一、新建一个控制台应用,引入htmlcxx的html目录,如下图
![](http://www.vipaq.com/Assets/Images/201308/13760194724706.png)
二、引入htmlcxx.lib所在目录,如下图
![](http://www.vipaq.com/Assets/Images/201308/13760196116210.png)
三、指定htmlcxx.lib文件
![](http://www.vipaq.com/Assets/Images/201308/13760196096643.png)
四、设置 运行库为多线程调试
![](http://www.vipaq.com/Assets/Images/201308/1376019613636.png)
在工程选项->链接->命令行最后一行加入 /NODEFAULTLIB:msvcrt.lib 禁用msvcrt.lib链接。否则会出现函数重定义。VS2005实测
五、全部代码如下
测试的HTML如下:<html> <body> <table> <tr><th>sender</th><th>receiver</th><th>name</th><th>downloaded</th><th>type</th><th>time</th></tr> <tr><th>sender</th><th>leader</th><th><A href="http://127.0.0.1:8080/getfile?md5=dca45b3f7735051a5eac8c158ca2fdb7">qt.conf</A></th><th>0</th><th>pic</th><th>2014-02-22/12:14:01</th></tr> <tr><th>sender</th><th>leader</th><th><A href="http://127.0.0.1:8080/getfile?md5=aa803bf8ec4e0a92b74dd6c274acee84">qt中文.conf</A></th><th>0</th><th>pic</th><th>2014-02-22/14:21:41</th></tr> </table> </body> </html>
main.cpp
#include <iostream> #include <fstream> #include "ParserDom.h" #define strcasecmp _stricmp using namespace std; using namespace htmlcxx; int main(int argc, char* argv[]) { fstream htmlFileStream; htmlFileStream.open( "C:/Users/along/Desktop/ddd.xml", ios::in ); //打开指定HTML文件,这里你需要修改成自己的文件地址 istreambuf_iterator<char> fileBeg(htmlFileStream), fileEnd; string html( fileBeg, fileEnd ); htmlFileStream.close(); string url = "", JStr = ""; string fileName = ""; size_t offset = 0, length = 0; HTML::ParserDom parser; tree<HTML::Node> dom = parser.parseTree(html); tree<HTML::Node>::iterator it = dom.begin(); for (; it != dom.end(); ++it) { if(!it->isTag()) continue ; if (_strcmpi(it->tagName().c_str() ,"A")== 0) //查找链接<A href="http://sssss/xxx.html">xxx.html</A> { it->parseAttributes(); if (it->attribute("href").first) { url = it->attribute("href").second; fileName=it.node->first_child->data;//提取xxx.html //fileName = it->text(); cout<<url<<endl; cout<<fileName<<endl; } } } system("pause"); return 0; }
相关文章推荐
- HTML-embed标签详解
- html rowspan colspan代码示例
- String转HTML Document
- Html.RenderPartial与Html.RenderAction 用法
- 【ibokan】PS常用快捷键
- SAP alv(lvc)的抬头标题设定(html_top_of_page)
- 使用Docx4J生成 html
- Failed to load resource in my index.html Page
- HTML Canvas 鼠标画图
- iReport制作EXCEL、PDF或者HTML文件
- html中strong与b,em与i标签的区别(转帖)
- wkhtmtopdf--高分辨率HTML转PDF(一)
- wkhtmtopdf--高分辨率转HTML成PDF--目录篇
- 使用HtmlAgilityPack批量抓取网页数据
- 一款很不错的html转xml工具-Html Agility Pack
- Html Agility Pack基础类介绍及运用
- HTML Agility Pack 搭配 ScrapySharp,彻底解除Html解析的痛苦
- html 的 cellpadding 与 cellspacing
- 在HTML中使用<script>做模板
- HTML 学习