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

來源:互聯網
上載者:User

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

  偶然一次機會在瀏覽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的一些選項

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

載入html字串內容,同時輸出轉換結果

// 載入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的根節點。

比如輸入的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

 

 

 

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.