最近正在上网络实验课程,正好到了正文的提取,而老师要求使用Dom-Tree来进行提取,需要我们提取将html转化成为xml,不是正在学习GNU C编程嘛,就想自己写一个的,蛋疼的发现html转化xml好象不是一两天的事,就想着是不是有什么工具(嘿嘿,比较懒,技术比较挫),突然发现一款神器 -- html tidy。这个软件可以帮助我们修正html中的常见的源码问题(丢失结束标签等)同时可以将html转化成为标准的XHTML,很不错。于是在网上搜寻tidy的GNU C的API接口的包,发现基本上没有关于GNU C上的使用tidy API的了,基本上是JTIDY等等一类的(看来在GNU C没有很多人用阿,但是我必须试试)。后来发现了其实在linux下对于tidy的支持基本上是处于原生的状态,只是没有提供默认安装。
1. 首先安装tidy这个软件,使用下面这个命令:
或者进入新立得软件包安装tidy,如下图:
图 1-1
图 1-2
2. 安装完成之后并不能直接在GNU C程序的编写中使用API,因为其不带安装包,这需要我们进入新立得软件包安装其开发包,其实上就是在/usr/include里面添加tidy的头文件这样,我们可以程序中添加头文件,然后这样可以使用tidy的API了,安装软件包如下图:
图 2-1
其实上 libtidy-dev这个包就是添加了几个.h的头文件了,如下图:
3. 在安装完成之后,就可以开始编写程序了,注意添加头文件,如上图的头文件在/usr/include/tidy下,所以添加头文件的时候是添加 #include <tidy/tidy.h> 类 型的, 如下的简单程序(这个是tidy官网的例子程序):
#include <tidy/tidy.h>
#include <tidy/buffio.h>
#include <stdio.h>
#include <errno.h>
int main(int argc, char **argv )
{
const char* input = "<title>Foo</title><p>Foo!";
TidyBuffer output = {0};
TidyBuffer errbuf = {0};
int rc = -1;
int ok;
TidyDoc tdoc = tidyCreate(); // Initialize "document"
printf( "Tidying:\t%s\n", input );
ok = tidyOptSetBool( tdoc, TidyXhtmlOut, yes ); // Convert to XHTML
if ( ok )
rc = tidySetErrorBuffer( tdoc, &errbuf ); // Capture diagnostics
if ( rc >= 0 )
rc = tidyParseString( tdoc, input ); // Parse the input
if ( rc >= 0 )
rc = tidyCleanAndRepair( tdoc ); // Tidy it up!
if ( rc >= 0 )
rc = tidyRunDiagnostics( tdoc ); // Kvetch
if ( rc > 1 ) // If error, force output.
rc = ( tidyOptSetBool(tdoc, TidyForceOutput, yes) ? rc : -1 );
if ( rc >= 0 )
rc = tidySaveBuffer( tdoc, &output ); // Pretty Print
if ( rc >= 0 )
{
if ( rc > 0 )
printf( "\nDiagnostics:\n\n%s", errbuf.bp );
printf( "\nAnd here is the result:\n\n%s", output.bp );
}
else
printf( "A severe error (%d) occurred.\n", rc );
tidyBufFree( &output );
tidyBufFree( &errbuf );
tidyRelease( tdoc );
return rc;
}
4. 由于安装的API的包只是头文件,直接进行编译会报 undefined reference to 的错误,这个是由于没有实现,只有声明,所以我们前面安装的 libtidy-0.99-0就有用了,这个是tidy的动态链接库,在/usr/lib下安装了libtidy.so这个文件,所以我们编译的时候要使用这个动态链接库,这样就不会报有声明,没实现的错误了,编译的命令如下:
这样就成功了,可以在GNU C下使用tidy的API了。
总结一下,其实我们这里只需要libtidy-dev的4个头文件,libtidy.so这个动态链接库,然后在程序编译的时候,添加动态链接库即可,没有想象中的那么难,基本上几步可以操作完成,感觉原生支持,可能是在GNU C上面的没有那么多人去搞这个玩意儿,反而在java上面搞得比较的多,所以文章也多。写下这篇文章纪念以下我浪费的半天时间,同时也能够帮助后面那么不知道这么在GNU C上使用tidy的同学们,免得浪费那么多时间。