您的位置:首页 > Web前端 > HTML

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下不可见,将双引号删除,重新手打一遍再生成就可以通过了。


还要设置htmlcxx运行库为多线程调试 (非常重要) 否则会出现后期链接错误



编译完之后,工程生成了一个htmlcxx.lib静态库文件。下面附上一个测试的详细例子。功能是:打开一个文件后,读取它的title内容。


一、新建一个控制台应用,引入htmlcxx的html目录,如下图




二、引入htmlcxx.lib所在目录,如下图




三、指定htmlcxx.lib文件




四、设置 运行库为多线程调试



在工程选项->链接->命令行最后一行加入 /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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: