HtmlAgilityPack應該算是.Net下最好用的html解析庫了。html
由於最近幫朋友採集一些數據,在nuget裏面搜索了好幾個庫,最後決定就用HtmlAgilityPack。並簡單的記錄下使用的姿式。node
直接使用nuget包安裝web
Install-Package HtmlAgilityPack -Version 1.11.16
該庫提供了一個下載網頁的類:HtmlWeb服務器
var webGet = new HtmlWeb();
var document = webGet.Load(url);
若是網絡正常的話,就會拿到一個HtmlDocument的對象。後面咱們全部的操做都是基於該類作的。網絡
我我的更喜歡使用HttpClient來下載網頁,而後使用HtmlDocument來LoadHtml。由於本身使用HTMLClient可控性更高。好比要加代理IP,隨機設置UA等操做。post
固然簡單的使用,使用HtmlWeb就差很少了。網站
第一步拿到的htmlDocument對象,裏面提供了不少操做。url
舉個栗子,好比咱們要獲取網頁的文章的做者,直接在Chrome中右鍵->審查元素->elements->右鍵->Copy->Copy Xpathspa
document.DocumentNode.SelectSingleNode("Chrome複製的xpath")?.InnerText
而後就成功採集到了做者名字代理
用博客園舉栗子,首頁就是一個列表文章頁。咱們如何獲取到這個列表全部的項呢?
var nodes = document.DocumentNode.SelectNodes("xpath表達式")
若是熟悉xpath的老哥們就知道使用雙斜槓開頭的,就能夠獲取到多項節點的結果。好比博客園的表達式爲: //div[@class='post_item'],而後獲取到HtmlDocument的一個集合,再解析集合的子節點,就好了!
有些文章中,會隱藏a標籤來給批量採集的人下毒。
能夠直接使用Descendants方法找到全部的a標籤,而後刪除
var aNodes = 獲取到的HtmlDocument對象.DocumentNode.Descendants("a")
foreach (var anode in aNodes.ToArray()) { anode.Remove(); }
通常圖片地址放在img的src屬性上,
var imgNodes = detail.DocumentNode.Descendants("img");
foreach (var img in imgNodes) { string imgurl = img.GetAttributeValue("src",""); }
獲取到地址,就可使用HTTPClient來下載圖片並保存到文件夾中
舉個栗子,若是咱們把圖片上傳到咱們的服務器,而後要在文章中替換掉別人的圖片地址,那應該怎麼作呢?
var imgNodes = detail.DocumentNode.Descendants("img");
foreach (var img in imgNodes) { img.SetAttributeValue("src", "圖片地址"); }
基本上,掌握這幾點,就能處處去採集別人的網站了。
固然HtmlAgilityPack的功能遠遠不止本文所描述的這些,更多的功能,可能須要有更深刻的需求才會用到,
有不懂或者須要交流的大佬們,能夠加個人QQ:862640563 QQ羣:545594312