一款很不錯的html轉xml工具-Html Agility Pack 實現html轉Xml

【轉】一款很不錯的html轉xml工具-Html Agility Packhtml

  以前發個一篇關於實現html轉成xml的劣做《實現html轉Xml》,受到很多網友的關心。該實現方法是藉助htmlparser去分解html內容,而後按照dom的結構逐個生成xml字符串。在沒有充分實踐後,還覺得該方案能解決問題。然而通過實際使用,效率確實很低,並且對一些特殊html屬性的轉換也不支持,獲得的結果差強人意。c#

  偶然一次機會在瀏覽codeplex網站時,發現一款很不錯的html解析以及轉換工具,就是本篇標題所提到的Html Agility Pack。Html Agility Pack是codeplex裏的一款開源框架,其主要功能是利用對象模型去操做html內容,可以把xpath等xml方面的技術簡單、靈活地應用在html文檔解析中。正如其介紹所說的那樣,該框架很是適合用於開發爬蟲,網絡數據挖掘工具。更重要的是該框架徹底由c#語言編寫,便於對框架的修改和深刻的研究。安全

  下面來看看如何將html轉換成xml格式網絡

  首先建立一個HtmlDocument對象(該HtmlDocument是Html Agility Pack中的類,並非winform裏的那個),全部的對html的操做都經過這個對象實現。框架

HtmlDocument htmlDoc  =   new  HtmlDocument();

接着設置輸出成xml的一些選項dom

// 輸出成xml格式
htmlDoc.OptionOutputAsXml  =   true ;

加載html字符串內容,同時輸出轉換結果ide

//  加載html內容
htmlDoc.LoadHtml( @" <html><body>
<table>
         <tr>
         <td>dafd</td>
         <td>
         </tr>
  </table>
</body></html>
" );

 
//  將輸出結果保存到字符串流中
  StringBuilder sbXml  =   new  StringBuilder();
  StringWriter sw 
=   new  StringWriter(sbXml);
  htmlDoc.Save(sw);

 Console.WriteLine(sbXml.ToString());

提供的html內容並非良好格式的xml,轉換以後的結果:工具

<? xml version="1.0" encoding="gb2312" ?>
< html >
< body >
                
< table >
                    
< tr >
                        
< td > dafd </ td >
                        
< td ></ td >
                    
</ tr >
                
</ table >
</ body >
</ html >

轉換以後,自動修復了沒有匹配標記,而且加上了xml的聲明。網站

另外在使用的時候,若是給定的html文檔內容沒有根節點,那麼轉換以後會自動添加一個名稱爲span的根節點。ui

好比輸入的html文檔以下:

< script > var  b  = ' b ' ; </ script >
< html >< body >
                
< table >
                    
< tr >
                        
< td > dafd </ td >
                        
< td >
                    
</ tr >
                
</ table >
                
</ body >
</ html >

轉換結果以下:

<? xml version="1.0" encoding="gb2312" ?> < span >< script >
//
<![CDATA[
var b ='b';
//
]]> //
</ script >< html >< body >
                
< table >
                    
< tr >
                        
< td > dafd </ td >
                        
< td >
                    
</ td ></ tr >
                
</ table >
                
</ body ></ html ></ span >

這種方式保證了轉換時的安全,是否使用仍是看具體的項目要求。

  以上方式是給定了已有的html字符串,還有另一種更加方便的方式,那就是直接給出url路徑,利用HtmlWeb就能包辦下載以及轉換的功能。實現方式以下:

            StringBuilder sbXml  =   new  StringBuilder();
            StringWriter sw 
=   new  StringWriter(sbXml);
            XmlTextWriter tw 
=   new  XmlTextWriter(sw);

            HtmlWeb htmlWeb 
=   new  HtmlWeb();
            htmlWeb.LoadHtmlAsXml(
" http://htmlagilitypack.codeplex.com/ " , tw);

            Console.WriteLine(sbXml.ToString());

以上方式雖然方便,可是有一個不穩定的因素是:下載過來的html文檔頗有多是亂碼,並確實存在這種狀況,爲了更好的使用,我修改了下源代碼,讓其在下載的時候就能自動判斷編碼方式。

  Html Agility Pack的效率比htmlparser有了很大的提高。可是在處理一些超大頁面時,仍是要有一些等待。另外還有一個美中不足的是,轉換的結果仍是不能100%地符合表中html格式的內容,只能說是95%地接近,比起firebug的html解析功能還差的遠。

 

Html Agility Pack的下載連接

http://htmlagilitypack.codeplex.com/ 

修改過的dll(修復文檔下載後亂碼的問題)

 HtmlAgilityPack_Shenba

相關文章
相關標籤/搜索