htmlcxx 解析 html 用法

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生成错误

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

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

引入htmlcxx目录

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

引入htmlcxx.lib所在目录

三、指定htmlcxx.lib文件

指定htmlcxx.lib文件

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

设置htmlcxx运行库为多线程调试

在工程选项->链接->命令行最后一行加入   /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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值