對於GNU C 下的html tidy編程的問題

來源:互聯網
上載者:User

最近正在上網路實驗課程,正好到了本文的提取,而老師要求使用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的同學們,免得浪費那麼多時間。

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.