.Net Core下使用HtmlAgilityPack解析採集互聯網數據

HtmlAgilityPack應該算是.Net下最好用的html解析庫了。html

 

由於最近幫朋友採集一些數據,在nuget裏面搜索了好幾個庫,最後決定就用HtmlAgilityPack。並簡單的記錄下使用的姿式。node

直接使用nuget包安裝web

Install-Package HtmlAgilityPack -Version 1.11.16

 

1.下載網頁

該庫提供了一個下載網頁的類:HtmlWeb服務器

var webGet = new HtmlWeb(); 
var document = webGet.Load(url);

若是網絡正常的話,就會拿到一個HtmlDocument的對象。後面咱們全部的操做都是基於該類作的。網絡

我我的更喜歡使用HttpClient來下載網頁,而後使用HtmlDocument來LoadHtml。由於本身使用HTMLClient可控性更高。好比要加代理IP,隨機設置UA等操做。post

固然簡單的使用,使用HtmlWeb就差很少了。網站

2.解析網頁

第一步拿到的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

相關文章
相關標籤/搜索