天天看點

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

  偶然一次機會在浏覽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轉xml工具-Html Agility Pack
一款很不錯的html轉xml工具-Html Agility Pack

// 加載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,轉換之後的結果:

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

<?xml version="1.0" encoding="gb2312"?>

<html>

<body>

                <table>

                    <tr>

                        <td>dafd</td>

                        <td></td>

                    </tr>

                </table>

</body>

</html>

轉換之後,自動修複了沒有比對标記,并且加上了xml的聲明。

另外在使用的時候,如果給定的html文檔内容沒有根節點,那麼轉換之後會自動添加一個名稱為span的根節點。

比如輸入的html文檔如下:

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

<script>var b ='b';</script>

<html><body>

                        <td>

                </body>

轉換結果如下:

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

<?xml version="1.0" encoding="gb2312"?><span><script>

//<![CDATA[

var b ='b';

//]]>//

</script><html><body>

                    </td></tr>

                </body></html></span>

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

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

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

            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的下載下傳連結

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

繼續閱讀