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