91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

c#項目中到Html怎么利用HtmlAgilityPack進行解析

發布時間:2020-12-14 14:07:23 來源:億速云 閱讀:245 作者:Leah 欄目:開發技術

這篇文章給大家介紹c#項目中到Html怎么利用HtmlAgilityPack進行解析,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

HtmlAgilityPack 是一個開源的快速解析Html的C#類庫。簡單理解,它可以像解析Xml一樣,將Html根據XPATH轉化為一個個Node節點,并支持調整節點以及節點的各種屬性。

多種方式加載Html

主要加載方式有3類:從網絡鏈接加載、從字符串文本中加載、從文件加載

var doc = new HtmlDocument();
//直接通過url加載
doc = new HtmlWeb().Load("https://www.baidu.com/");
//通過字符串加載
doc.LoadHtml(result);
//通過html文件加載 可指定編碼方式
doc.Load(@"c://index.html",Encoding.UTF8)

HtmlNode常用方法

使用SelectNodes()和SelectSingleNode()方法(類似解析XML格式數據的XmlDocument)來獲取的目標節點,分別對應HtmlNodeCollection和HtmlNode兩個類。

"//"表示從根節點開始查找,兩個斜杠"//"表示查找所有childnodes;一個斜杠"/"表示只查找第一層的childnodes(即不查找grandchild);點斜杠"./"表示從當前結點而不是根結點開始查找(只在xpath最開始出現)

注意:

id class 屬性匹配大小寫敏感
xpath匹配下標從1開始

1. 通過屬性和路徑匹配來選擇對應的節點

var node = doc.DocumentNode;

//選擇不包含class屬性的div節點
var result = node.SelectNodes(".//div[not(@class)]");

//選擇不包含class和id屬性的div節點
var result = node.SelectNodes(".//div[not(@class) and not(@id)]");

//選擇class中包含"expire"的span節點
var result = node.SelectNodes(".//span[contains(@class,'expire')]");

//選擇class中不包含"expire"的span節點
var result = node.SelectNodes(".//span[not(contains(@class,'expire'))]");

//選擇class="expire"的span節點
var result = node.SelectNodes(".//span[@class='expire']");

//選擇id="expire"的div節點下第一個div節點
var result = node.SelectSingleNode(".//div[@id='expire']/div[1]");

2. 獲取節點文本內容

根據需求不同,通過不同的方式來獲取相應的文本內容。
OuterHtml:返回包含當前節點在內的所有Html
InnerHtml:返回當前節點內所有子節點Html
InnerText:返回當前節點內去除所有Html后的文本內容

<div id="title">
  <p>
   <a class="MainTitle" href="https://www.cnblogs.com/cplemom/" rel="external nofollow" rel="external nofollow" rel="external nofollow" >傅小灰</a>
  </p>
</div>

以上面的Html為例

var node= doc.DocumentNode.SelectSingleNode("//div[@id='title'/p]");

node.OuterHtml; //返回結果:<p><a class="MainTitle"href="https://www.cnblogs.com/cplemom/" rel="external nofollow" rel="external nofollow" rel="external nofollow" >傅小灰</a></p>

node.InnerHtml; //返回結果:<a class="MainTitle"href="https://www.cnblogs.com/cplemom/" rel="external nofollow" rel="external nofollow" rel="external nofollow" >傅小灰</a>

node.InnerText; //返回結果:傅小灰

3. 獲取/修改節點屬性值

以上面的Html舉例,我們獲取到了a標簽為node節點。我們想要獲取a標簽指向的鏈接地址,并修改為我們設定的地址。這里以href屬性舉例,同樣可以用在class/src/id等屬性上。

var node= doc.DocumentNode.SelectSingleNode("//div[@id='title'/p/a]");

//第二個參數為找不到對應屬性時返回的默認值
var url = node.GetAttributeValue("href", "");//返回結果:https://www.cnblogs.com/cplemom/

//設置屬性值
node.SetAttributeValue("href", "http://www.cplemom.com/");

//獲取所有屬性值
var list = node.Attributes.ToList();

4. 刪除/替換節點

繼續以上面的Html舉例,我們獲取到了a標簽為node節點。
對于我們不需要的內容,我們只需要調用節點Remove方法即可。

var node= doc.DocumentNode.SelectSingleNode("//div[@id='title'/p/a]");

node.Remove();//刪除節點

一個很常見的場景就是我們需要移除a標簽,但是要在html上下文中保留a標簽的文本。
PS : a標簽內的文本在HtmlDocument中其實是一個text類型的node節點。所以我們可以通過刪除a標簽,保留text標簽的方式來完成目標。

node.ParentNode.RemoveChild(node,true);

true表示留下a標簽的子節點只刪除a標簽,在這里就表示保留下“傅小灰”text節點; false表示將此結點連同所有子節點一起刪除。

換個角度思考下,當前node節點代表的是單個a標簽,那么如果p標簽下存在多個a標簽需要處理,或者node節點指向的就是p標簽呢?當然,我們可以通過獲取所有a標簽然后循環處理的方式來實現,但是還有沒有別的更好的處理方式呢?

這里提供一個思路,獲取所有的文本內容,新建為一個text節點,然后替換掉當前節點。

node.ParentNode.ReplaceChild(HtmlNode.CreateNode(item.InnerText), node);

幾個常見使用場景和解決方案

1. 獲取所有的img標簽

//通過Descendants獲取所有的子后代節點中的img標簽
var list = node.Descendants("img");


//通過Xpath匹配獲取所有img標簽
var list = node.SelectNodes("//img");

2. 通過url訪問時需要攜帶cookie等驗證信息

有些頁面需要攜帶驗證信息才能訪問,比如用戶中心,訂單列表等,這時候直接通過HtmlWeb類獲取html會被拒絕。有個簡單的方式就是通過HttpClient請求到對應的html內容,再使用HtmlDocument加載。其實HtmlWeb說白了也是封裝的HttpWebRequest進行網絡請求的,所以暴露一個委托給外部用以修改請求上下文。

var web = new HtmlWeb();
web.PreRequest = new HtmlWeb.PreRequestHandler(GetRequest);
var node = web.Load("https://www.cplemom.com/");

public static bool GetRequest(HttpWebRequest req)
{
  req.Headers.Add("Host", "www.cplemom.com");
	req.Headers.Add("Cookie", "xxxxxxxxxxxxx");
  return true;
}

關于c#項目中到Html怎么利用HtmlAgilityPack進行解析就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

芦溪县| 民勤县| 西平县| 册亨县| 上林县| 乌兰察布市| 鹤岗市| 德令哈市| 龙川县| 江西省| 湟中县| 宜章县| 昌黎县| 鲁山县| 深水埗区| 万荣县| 谷城县| 简阳市| 隆化县| 常山县| 铜陵市| 泸溪县| 武夷山市| 天长市| 永吉县| 乳源| 旬邑县| 荥经县| 夏津县| 东丽区| 泸水县| 丰城市| 鄂伦春自治旗| 东阿县| 合水县| 四会市| 张北县| 青州市| 外汇| 阿城市| 望城县|