ekhtml是一个非常简单的html解析库,不但可以解析html而且对于xml也有一定的解析效果。鉴于没有前国内还没有这个简单的库的教程,所以我把学习体会写在下面,供新人参考。
1.安装
1.1 下载
安装ekhtml除了在官方网站下载之外,你还可以在cvs上面下载。在你的Unix/Linux主机上面安装cvs之后执行下面的命令:
1.2 编译
1.进入ekhtml的目录
2.执行 ./autogen.sh
3.执行 make
4.用root身份执行 make install
这样就完成了安装。
2.ekhtml使用
2.1 数据
1.struct ekhtml_string_t
这是ekhtml的字符串,这个字符串没有'\0'字符作为结尾。但是它包含两个成员: *char str ,和一个 int len。
1.struct ekhtml_attr_t
对象属性,其实可以用对象属性作为一个列表。
对象属性里面有四个字段:name,val 是ekhtml_string_t类型的。isBoolean是个unsigned int类型。最后一个字段指向下一个属性。
2.2 一些Typedefs
typedef ekhtml_string_t ekhtml_string_t;
typedef ekhtml_attr_t ekhtml_attr_t; //这两个类型上面已经说过了
typedef ekhtml_parser_t ekhtml_parser_t;
//parser_t的对象保存了一些状态信息,比如读到了一个标签,要调用什么函数来进行处理。多少数据开始处理等等。
2.3 回调函数
typedef void(* ekhtml_data_cb_t )(void *cbdata, ekhtml_string_t *data);
typedef void(* ekhtml_starttag_cb_t )(void *cbdata, ekhtml_string_t *tag, ekhtml_attr_t *attrs);
typedef void(* ekhtml_endtag_cb_t )(void *cbdata, ekhtml_string_t *tag);
上面这几个函数,我放到一起说明。如果我们要处理一个页面,那么这个页面也许会是这样:
被"<>"包围的内容是 ekhtml_starttag_cb_t 所要处理的内容。我们可以定义一个函数:
第一个参数是你处理出来的数据,也就说是个返回结果。
第二个参数是个字符串,也可以是NULL。是字符串说明你要解析的标签名,NULL会处理所有你没有指定标签名的标签。
第三个参数,负责返回标签属性。
在</ >中间的内容是标签结束 ekhtml_endtag_cb_t 会处理它们。 参数和第一个比只是少了最后标签属性。
比如“测试页面”,“页面信息!”这样的字是标签数据。你自己定义的ekhtml_data_cb_t会处理这些东西。
我们可以定义一些类似这样的函数来处理我们的页面。那么如何把这些回调函数关联到我们的解析里面呢?
2.4 如何解析
首先要 ekhtml_parser_new 新建一个parser对象,然后执行下面的代码:
第一个函数和第二个函数处理数据和注释。这些函数的作用是把你定义的回调函数绑定到你指定的ekhtml_parser_t 类型的对象上面。
当你完成了绑定,你就可以去处理网页了。比较简单的处理方式是:
这最后我们强制刷flush一下后就ekhtml_parser_delete
这就是整个解析过程。
3 参考资料
http://ekhtml.sourceforge.net/docs/index.html
http://ekhtml.cvs.sourceforge.net/ekhtm ... iew=markup
1.安装
1.1 下载
安装ekhtml除了在官方网站下载之外,你还可以在cvs上面下载。在你的Unix/Linux主机上面安装cvs之后执行下面的命令:
cd ~
cvs -d:pserver:anonymous@ekhtml.cvs.sourceforge.net:/cvsroot/ekhtml login
cvs -z3 -d:pserver:anonymous@ekhtml.cvs.sourceforge.net:/cvsroot/ekhtml co -P ekhtml
1.2 编译
1.进入ekhtml的目录
2.执行 ./autogen.sh
3.执行 make
4.用root身份执行 make install
这样就完成了安装。
2.ekhtml使用
2.1 数据
1.struct ekhtml_string_t
这是ekhtml的字符串,这个字符串没有'\0'字符作为结尾。但是它包含两个成员: *char str ,和一个 int len。
1.struct ekhtml_attr_t
对象属性,其实可以用对象属性作为一个列表。
对象属性里面有四个字段:name,val 是ekhtml_string_t类型的。isBoolean是个unsigned int类型。最后一个字段指向下一个属性。
2.2 一些Typedefs
typedef ekhtml_string_t ekhtml_string_t;
typedef ekhtml_attr_t ekhtml_attr_t; //这两个类型上面已经说过了
typedef ekhtml_parser_t ekhtml_parser_t;
//parser_t的对象保存了一些状态信息,比如读到了一个标签,要调用什么函数来进行处理。多少数据开始处理等等。
2.3 回调函数
typedef void(* ekhtml_data_cb_t )(void *cbdata, ekhtml_string_t *data);
typedef void(* ekhtml_starttag_cb_t )(void *cbdata, ekhtml_string_t *tag, ekhtml_attr_t *attrs);
typedef void(* ekhtml_endtag_cb_t )(void *cbdata, ekhtml_string_t *tag);
上面这几个函数,我放到一起说明。如果我们要处理一个页面,那么这个页面也许会是这样:
<html>
<head>
<title>测试页面</title>
</head>
<body>
页面信息!
</body>
</html>
被"<>"包围的内容是 ekhtml_starttag_cb_t 所要处理的内容。我们可以定义一个函数:
static void handle_starttag(void *cbdata, ekhtml_string_t *tag,
ekhtml_attr_t *attrs);
第一个参数是你处理出来的数据,也就说是个返回结果。
第二个参数是个字符串,也可以是NULL。是字符串说明你要解析的标签名,NULL会处理所有你没有指定标签名的标签。
第三个参数,负责返回标签属性。
在</ >中间的内容是标签结束 ekhtml_endtag_cb_t 会处理它们。 参数和第一个比只是少了最后标签属性。
比如“测试页面”,“页面信息!”这样的字是标签数据。你自己定义的ekhtml_data_cb_t会处理这些东西。
我们可以定义一些类似这样的函数来处理我们的页面。那么如何把这些回调函数关联到我们的解析里面呢?
2.4 如何解析
首先要 ekhtml_parser_new 新建一个parser对象,然后执行下面的代码:
ekhtml_parser_datacb_set();
ekhtml_parser_commentcb_set();
ekhtml_parser_startcb_add();
ekhtml_parser_endcb_add();
ekhtml_parser_cbdata_set();
第一个函数和第二个函数处理数据和注释。这些函数的作用是把你定义的回调函数绑定到你指定的ekhtml_parser_t 类型的对象上面。
当你完成了绑定,你就可以去处理网页了。比较简单的处理方式是:
while()
{
fread(...); //读你的文件 标准函数没啥说的了。
//在这里运行
ekhtml_parser_feed(); //这里就是解析 这里是解析传进来的部分,和下面一句配合。通过fread可以把数据组合在一起
ekhtml_parser_flush(); //刷新缓冲 第一个参数是 parser 第二个参数如果是true 就强制刷新
}
这最后我们强制刷flush一下后就ekhtml_parser_delete
这就是整个解析过程。
3 参考资料
http://ekhtml.sourceforge.net/docs/index.html
http://ekhtml.cvs.sourceforge.net/ekhtm ... iew=markup




