html开源库,htmlcxx——c++的开源html解析库
前几周为实验室处理实验数据,需要将html文件数据转换为xml。在解析html时,在网上搜索了一些解析html的库,发现这个库还是很不错的,其工作原理就是建了一个DOM树。我用的版本是0.85,这篇blog不会说明如何用这个库来编程,而是总结一些使用这个库时需要更改的一些地方,以方便大家使用。首先这个库使用前需要将其编译成lib,第一次编译应该是通过不了的,需要修改utils.cc文件中的第17行
前几周为实验室处理实验数据,需要将html文件数据转换为xml。在解析html时,在网上搜索了一些解析html的库,发现这个库还是很不错的,其工作原理就是建了一个DOM树。我用的版本是0.85,这篇blog不会说明如何用这个库来编程,而是总结一些使用这个库时需要更改的一些地方,以方便大家使用。
首先这个库使用前需要将其编译成lib,第一次编译应该是通过不了的,需要修改utils.cc文件中的第17行,如图:
将变量signature后的等号以及双引号去掉。之后就能够编译通过。
但是这样还是不够的,我处理第一个html的时候还好好的,但是多处理几个之后,发现会报一个错误:_ASSERTE((unsigned)(c + 1) <= 256)。经过各种检查之后,发现是因为碰到了中文的问题,因为中文的ASCII码大于256了,而isspace函数要求传入的参数必须小于256。因此需要找到Node.cc文件中的isspace函数,并进行如下类似修改:
//while (isspace(*begin) && begin < end) ++begin;
while (((unsigned)*begin > 255 || isspace(*begin)) && begin < end) ++begin;
上网查了一些资料,还需要修改一些地方:
还是Node.cc文件,第28行需要进行如下修改:
while (!isspace(*ptr))
{
++ptr;//这种处理方式就断言了:tag名和'>'符号之间一定有空格
}
改成:
while (!isspace(*ptr))
{
if(*ptr == '>')
return;
++ptr;
}
另一处是需要修改ParserSax.tcc文件,注意这个文件在visual studio打开的工程中是看不到的,要在工程文件夹里找,修改如下:
template
_Iterator
htmlcxx::HTML::ParserSax::skipHtmlComment(_Iterator c, _Iterator end)
{
while ( c != end ) {
if (*c++ == '-' && c != end && *c == '-')
{
_Iterator d(c);
while (++c != end &&((unsigned)*c > 255 || !isspace(*c) ) && *c != '>');
if (c == end || *c++ == '>') break;
c = d;
}
}
return c;
}
做完这些后,有时还是会报那个断言错误(好烦啊!)。这是因为ctype.h这个头文件里定义的函数的问题,系统默认编译的时候char是有符号的,也就是范围是-128 —— 127,因此给char类型赋值超过127的时候就会报错。因此我们设置默认char无符号就可以了,但是偏偏vs2010把这个选项去了。没关系,还有办法,在
使用这个库的项目上
右键——属性——配置属性——C/C++——命令行,在下面的其它选项的大块输入框中输入“
/J”。
好了,我们改处理的bug都处理完了,可以使用了。
最后再同一说明一下如何在项目里加lib库。
在项目上右键——属性——配置属性——VC++目录中的“包含目录”中选择所用库的头文件路径,在“库目录中”选择所用库的lib文件路径。
在项目上右键——属性——配置属性——连接器——输入中的“附加依赖项”中输入“htmlcxx.lib”。
这个库据说还很好地处理了一些字符编码问题,不过我使用的时候还没有用过这些功能,以后有机会再学习吧。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)