HtmlAgilityPack --解析Html源碼

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   使用   os   資料   

 最近項目需要從網路上抓取一下資料解析Html源碼,奈何Regex難寫,於是網上搜尋找到了“ HtmlAgilityPack”類庫,敏捷開發,果然效率非同尋常。

 在此做筆記,寫下心得,順便給自己總結一下。

 1、 HtmlAgilityPack使用的是XPath進行路徑搜尋,如果對XML路徑搜尋很熟悉,用起來會得心應手

<?xml version="1.0" encoding="ISO-8859-1"?><bookstore><book>  <title lang="eng">Harry Potter</title>  <price>29.99</price></book><book>  <title lang="eng">Learning XML</title>  <price>39.95</price></book></bookstore>
View Code
/bookstore/book[1] 選取屬於 bookstore 子項目的第一個 book 元素。
/bookstore/book[last()] 選取屬於 bookstore 子項目的最後一個 book 元素。
/bookstore/book[last()-1] 選取屬於 bookstore 子項目的倒數第二個 book 元素。
/bookstore/book[position()<3] 選取最前面的兩個屬於 bookstore 元素的子項目的 book 元素。
//title[@lang] 選取所有擁有名為 lang 的屬性的 title 元素。
//title[@lang=‘eng‘] 選取所有 title 元素,且這些元素擁有值為 eng 的 lang 屬性。
/bookstore/book[price>35.00] 選取 bookstore 元素的所有 book 元素,且其中的 price 元素的值須大於 35.00。
/bookstore/book[price>35.00]/title 選取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值須大於 35.00。

2、HtmlAgilityPack基本用法:

  最常使用的方法:SelectNodes (XPath)、 SelectSingleNode(XPath) 、

  CreateNode(HtmlNode.OuterHtml)(該方法通常用在查詢完的結果再次進行分析,無法從查詢出來的節點進行操作,查詢是對大節點樹的操作),一般用法

 其流程一般是先擷取HTML,這個可以通過HtmlDocument的Load()或LoadHtml()來載入靜態內容,或者也可以HtmlWeb的Get()或Load()方法來載入網路上的URL對應的HTML。(此方法我還沒嘗試,不知道是否能夠載入網路上的方法)
 得到了HtmlDocument的執行個體之後,就可以用HtmlDocument的DocumentNode屬性,這是整個HTML文檔的根節點,它本身也是一個HtmlNode,然後就可以利用HtmlNode的SelectNodes()方法返回多個HtmlNode的集合對象HtmlNodeCollection,也可以利用HtmlNode的SelectSingleNode()方法返回單個HtmlNode。

我從網站擷取資料用WebClient、WebRequest、WebResponse 簡單協議(Http、ftp)請求,基本滿足項目要求:

常用的屬性:InnerHtml  InnerText   OuterHtml

            /// <summary>        /// 通過Stream流下載Html源碼        /// </summary>        /// <param name="Url"></param>        /// <returns></returns>        public static string DownLoadHtmlCode(string Url)        {            string HtmlCode = "";            if (string.IsNullOrEmpty(Url)) return "";            WebClient client = new WebClient();            Stream stream=  client.OpenRead(Url);            StreamReader sr = new StreamReader(stream);            HtmlCode = sr.ReadToEnd();            sr.Close();            stream.Close();            client.Dispose();            return HtmlCode;        }

                   HtmlAgilityPack.HtmlDocument hd = new HtmlAgilityPack.HtmlDocument();
                    //載入Html文檔
                     hd.LoadHtml(DownLoadHtmlCode("http://www.baidu.com")); 

                      //以下是從代碼裡面截取部分資訊

HtmlNode strHtml = null;
foreach (var item in hd.DocumentNode.SelectNodes("//*[@id=‘header‘]"))
{
//解析品牌
strHtml = HtmlNode.CreateNode(item.OuterHtml);
Project.Brand = strHtml.SelectSingleNode("//a[last()-1]").InnerText.Replace("移動手機", "").Replace("手機", "") + "<br/>";
}

 

 3、刪除樣式、指令碼、指令碼注釋

    從密密麻麻的源碼中尋找有效源碼資訊,刪除樣式、指令碼、指令碼注釋,解析擷取innerHtml,裝載到泛型變數,進行二次操作(輸出頁面、資料庫儲存)

  //去掉指令碼標籤和內容                if (hd.DocumentNode.SelectNodes("//script")!=null)                {                    foreach (var script in hd.DocumentNode.SelectNodes("//script"))                        script.Remove();                }                            //去掉樣式標籤和內容                if (hd.DocumentNode.SelectNodes("//style")!=null)                {                    foreach (var style in hd.DocumentNode.SelectNodes("//style"))                        style.Remove();                }                                //去掉注釋標籤和內容                if (hd.DocumentNode.SelectNodes("//comment()")!=null)                {                    foreach (var comment in hd.DocumentNode.SelectNodes("//comment()"))                        comment.Remove();//新增的代碼                }
View Code

 總結:

  HtmlAgilityPack 工具能夠快速上手,而且是開源的,能夠滿足解析Html源碼需求。

聯繫我們

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