成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

c#項目中到Html怎么利用HtmlAgilityPack進(jìn)行解析-創(chuàng)新互聯(lián)

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

赤壁ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!

HtmlAgilityPack 是一個開源的快速解析Html的C#類庫。簡單理解,它可以像解析Xml一樣,將Html根據(jù)XPATH轉(zhuǎn)化為一個個Node節(jié)點,并支持調(diào)整節(jié)點以及節(jié)點的各種屬性。

多種方式加載Html


主要加載方式有3類:從網(wǎng)絡(luò)鏈接加載、從字符串文本中加載、從文件加載

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格式數(shù)據(jù)的XmlDocument)來獲取的目標(biāo)節(jié)點,分別對應(yīng)HtmlNodeCollection和HtmlNode兩個類。

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

注意:

id class 屬性匹配大小寫敏感
xpath匹配下標(biāo)從1開始

1. 通過屬性和路徑匹配來選擇對應(yīng)的節(jié)點

var node = doc.DocumentNode;

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

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

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

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

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

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

2. 獲取節(jié)點文本內(nèi)容

根據(jù)需求不同,通過不同的方式來獲取相應(yīng)的文本內(nèi)容。
OuterHtml:返回包含當(dāng)前節(jié)點在內(nèi)的所有Html
InnerHtml:返回當(dāng)前節(jié)點內(nèi)所有子節(jié)點Html
InnerText:返回當(dāng)前節(jié)點內(nèi)去除所有Html后的文本內(nèi)容

<div id="title">
  <p>
   <a class="MainTitle" href="/tupian/20230522/" rel="external nofollow" rel="external nofollow" rel="external nofollow" >傅小灰</a>
  </p>
</div>

以上面的Html為例

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

node.OuterHtml; //返回結(jié)果:<p><a class="MainTitle"href="/tupian/20230522/" rel="external nofollow" rel="external nofollow" rel="external nofollow" >傅小灰</a></p>

node.InnerHtml; //返回結(jié)果:<a class="MainTitle"href="/tupian/20230522/" rel="external nofollow" rel="external nofollow" rel="external nofollow" >傅小灰</a>

node.InnerText; //返回結(jié)果:傅小灰

3. 獲取/修改節(jié)點屬性值

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

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

//第二個參數(shù)為找不到對應(yīng)屬性時返回的默認(rèn)值
var url = node.GetAttributeValue("href", "");//返回結(jié)果:/tupian/20230522/

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

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

4. 刪除/替換節(jié)點

繼續(xù)以上面的Html舉例,我們獲取到了a標(biāo)簽為node節(jié)點。
對于我們不需要的內(nèi)容,我們只需要調(diào)用節(jié)點Remove方法即可。

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

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

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

node.ParentNode.RemoveChild(node,true);

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

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

這里提供一個思路,獲取所有的文本內(nèi)容,新建為一個text節(jié)點,然后替換掉當(dāng)前節(jié)點。

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

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

1. 獲取所有的img標(biāo)簽

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


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

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

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

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;
}

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

標(biāo)題名稱:c#項目中到Html怎么利用HtmlAgilityPack進(jìn)行解析-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://jinyejixie.com/article22/ccpejc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、品牌網(wǎng)站制作、虛擬主機(jī)、定制開發(fā)、外貿(mào)網(wǎng)站建設(shè)動態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
湘阴县| 阳东县| 繁昌县| 旺苍县| 金沙县| 梁平县| 宜阳县| 邵阳县| 含山县| 板桥市| 沙洋县| 寿阳县| 通江县| 故城县| 苍梧县| 都安| 华阴市| 菏泽市| 台中市| 福州市| 浏阳市| 庄浪县| 化隆| 涡阳县| 文登市| 大埔县| 荣昌县| 保山市| 灵山县| 琼结县| 彭州市| 建始县| 平湖市| 长春市| 巴里| 加查县| 九江县| 芷江| 永善县| 德惠市| 普宁市|