对于GNU C 下的html tidy编程的问题

最近正在上网络实验课程,正好到了正文的提取,而老师要求使用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这个软件,使用下面这个命令:

 

sudo apt-get install 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这个文件,所以我们编译的时候要使用这个动态链接库,这样就不会报有声明,没实现的错误了,编译的命令如下:

gcc 文件名.c -L /usr/lib -ltidy

 

这样就成功了,可以在GNU C下使用tidy的API了。

 

总结一下,其实我们这里只需要libtidy-dev的4个头文件,libtidy.so这个动态链接库,然后在程序编译的时候,添加动态链接库即可,没有想象中的那么难,基本上几步可以操作完成,感觉原生支持,可能是在GNU C上面的没有那么多人去搞这个玩意儿,反而在java上面搞得比较的多,所以文章也多。写下这篇文章纪念以下我浪费的半天时间,同时也能够帮助后面那么不知道这么在GNU C上使用tidy的同学们,免得浪费那么多时间。

 

 

posted on 2010-10-25 22:43  唯一小神  阅读(718)  评论(0编辑  收藏  举报

导航