HtmlAgilityPack 之 HtmlNode类
HtmlAgilityPack中的HtmlNode類與XmlNode類差不多,提供的功能也大同小異。下面來看看該類提供功能。
一、靜態(tài)屬性
public static Dictionary<string, HtmlElementFlag> //ElementsFlags;獲取集合的定義為特定的元素節(jié)點(diǎn)的特定行為的標(biāo)志。表包含小寫標(biāo)記名稱作為鍵和作為值的 HtmlElementFlags 組合 DictionaryEntry 列表。 public static readonly string HtmlNodeTypeNameComment; //獲取一個注釋節(jié)點(diǎn)的名稱。實(shí)際上,它被定義為 '#comment public static readonly string HtmlNodeTypeNameDocument; //獲取文檔節(jié)點(diǎn)的名稱。實(shí)際上,它被定義為 '#document' public static readonly string HtmlNodeTypeNameText; //獲取一個文本節(jié)點(diǎn)的名稱。實(shí)際上,它被定義為 '#text'二、屬性
Attributes 獲取節(jié)點(diǎn)的屬性集合
ChildNodes 獲取子節(jié)點(diǎn)集合(包括文本節(jié)點(diǎn))
Closed 該節(jié)點(diǎn)是否已關(guān)閉(</xxx>)
ClosingAttributes ?在關(guān)閉標(biāo)簽的屬性集合
FirstChild ?獲取第一個子節(jié)點(diǎn)
HasAttributes ?判斷該節(jié)點(diǎn)是否含有屬性
HasChildNodes 判斷該節(jié)點(diǎn)是否含有子節(jié)點(diǎn)
HasClosingAttributes ?判斷該節(jié)點(diǎn)的關(guān)閉標(biāo)簽是否含有屬性(</xxx class="xxx">)
Id 獲取該節(jié)點(diǎn)的Id屬性
InnerHtml 獲取該節(jié)點(diǎn)的Html代碼
InnerText 獲取該節(jié)點(diǎn)的內(nèi)容,與InnerHtml不同的地方在于它會過濾掉Html代碼,而InnerHtml是連Html代碼一起輸出
LastChild ?獲取最后一個子節(jié)點(diǎn)
Line 獲取該節(jié)點(diǎn)的開始標(biāo)簽或開始代碼位于整個HTML源代碼的第幾行(行號)
LinePosition 獲取該節(jié)點(diǎn)位于第幾列
Name ?Html元素名
NextSibling 獲取下一個兄弟節(jié)點(diǎn)
NodeType ?獲取該節(jié)點(diǎn)的節(jié)點(diǎn)類型
OriginalName 獲取原始的未經(jīng)更改的元素名
OuterHtml 整個節(jié)點(diǎn)的代碼
OwnerDocument 節(jié)點(diǎn)所在的HtmlDocument文檔
ParentNode 獲取該節(jié)點(diǎn)的父節(jié)點(diǎn)
PreviousSibling 獲取前一個兄弟節(jié)點(diǎn)
StreamPosition 該節(jié)點(diǎn)位于整個Html文檔的字符位置
XPath ?根據(jù)節(jié)點(diǎn)返回該節(jié)點(diǎn)的XPath
代碼示例:
static void Main(string[] args){//<ul class="user_match clear">// <li>年齡:21~30之間</li>// <li>婚史:未婚</li>// <li>地區(qū):不限</li>// <li>身高:175~185厘米之間</li>// <li>學(xué)歷:不限</li>// <li>職業(yè):不限</li>// <li>月薪:不限</li>// <li>住房:不限</li>// <li>購車:不限</li>//</ul>WebClient wc = new WebClient();wc.BaseAddress = "http://www.juedui100.com/";wc.Encoding = Encoding.UTF8;HtmlDocument doc = new HtmlDocument();string html = wc.DownloadString("user/6971070.html");doc.LoadHtml(html);HtmlNode node = doc.DocumentNode.SelectSingleNode("/html/body/div[4]/div[1]/div[2]/ul[1]"); //根據(jù)XPath查找節(jié)點(diǎn),跟XmlNode差不多Console.WriteLine(node.InnerText); //輸出節(jié)點(diǎn)內(nèi)容 年齡:21~30之間 婚史:未婚 ...... 與InnerHtml的區(qū)別在于,它不會輸出HTML代碼Console.WriteLine(node.InnerHtml); //輸出節(jié)點(diǎn)Html <li>年齡:21~30之間</li> <li>婚史:未婚</li> ....Console.WriteLine(node.Name); //輸出 ul Html元素名 HtmlAttributeCollection attrs = node.Attributes;foreach(var item in attrs){Console.WriteLine(item.Name + " : " + item.Value); //輸出 class :user_match clear}HtmlNodeCollection CNodes = node.ChildNodes; //所有的子節(jié)點(diǎn)foreach (HtmlNode item in CNodes){Console.WriteLine(item.Name + "-" + item.InnerText); //輸出 li-年齡:21~30之間#text- li-婚史:未婚#text- ....... 別忘了文本節(jié)點(diǎn)也算}Console.WriteLine(node.Closed); //輸出True //當(dāng)前的元素節(jié)點(diǎn)是否已封閉Console.WriteLine("================================");HtmlAttributeCollection attrs1 = node.ClosingAttributes; //獲取在結(jié)束標(biāo)記的 HTML 屬性的集合。 例如</ul class="">Console.WriteLine(attrs1.Count); //輸出0HtmlNode node1 = node.FirstChild; //悲劇了ul的第一個節(jié)點(diǎn)是一個 \n 換行文本節(jié)點(diǎn) 第二個節(jié)點(diǎn)才到第一個liConsole.WriteLine(node1.NodeType); //輸出Text 文本節(jié)點(diǎn)HtmlNode node3 = node.LastChild; //同樣最后一個節(jié)點(diǎn)一樣是 \n 文本節(jié)點(diǎn)Console.WriteLine(node3.NodeType); //輸出Text 文本節(jié)點(diǎn)HtmlNode node2 = node.SelectSingleNode("child::li[1]"); //獲取當(dāng)前節(jié)點(diǎn)的第一個子li節(jié)點(diǎn)Console.WriteLine(node2.XPath); //根據(jù)節(jié)點(diǎn)生成XPath表達(dá)式 /html/body/div[4]/div[1]/div[2]/ul[1]/li[1] 媽了個B,強(qiáng)大Console.WriteLine(node.HasAttributes); //輸出 True 判斷節(jié)點(diǎn)是否含有屬性Console.WriteLine(node.HasChildNodes); //輸出 True 判斷節(jié)點(diǎn)是否含有子節(jié)點(diǎn)Console.WriteLine(node.HasClosingAttributes); //False 判斷節(jié)點(diǎn)結(jié)束標(biāo)記是否含有屬性Console.WriteLine(node.Line); //輸出 155 該節(jié)點(diǎn)開始標(biāo)記位于頁面代碼的第幾行Console.WriteLine(node.LinePosition); //輸出 1 該節(jié)點(diǎn)開始標(biāo)記位于第幾列2Console.WriteLine(node.NodeType); //輸出 Element 該節(jié)點(diǎn)類型 此處為元素節(jié)點(diǎn) Console.WriteLine(node.OriginalName); //輸出 ulHtmlNode node4 = node.SelectSingleNode("child::li[1]");Console.WriteLine(node4.InnerText); //輸出 年齡:21~30之間HtmlNode node5 = node4.NextSibling.NextSibling; //獲取下一個兄弟元素 因?yàn)橛幸粋€換行符的文本節(jié)點(diǎn),因此要兩次,跳過換行那個文本節(jié)點(diǎn)Console.WriteLine(node5.InnerText); //輸出 婚史:未婚HtmlNode node6 = node5.PreviousSibling.PreviousSibling; //同樣兩次以跳過換行文本節(jié)點(diǎn)Console.WriteLine(node6.InnerText); //輸出 年齡:21~30之間HtmlNode node7 = node6.ParentNode; //獲取父節(jié)點(diǎn)Console.WriteLine(node7.Name); //輸出 ulstring str = node.OuterHtml;Console.WriteLine(str); //輸出整個ul代碼class="user_match clear"><li>年齡:21~30之間</li>...</ul>Console.WriteLine(node.StreamPosition); //輸出7331 獲取此節(jié)點(diǎn)的流位置在文檔中,相對于整個文檔(Html頁面源代碼)的開始。HtmlDocument doc1 = node.OwnerDocument;doc1.Save(@"D:\123.html");HtmlNode node8 = doc.DocumentNode.SelectSingleNode("//*[@id=\"coll_add_aid59710701\"]");//<a id="coll_add_aid59710701" style="display:block" class="coll_fix needlogin" href="javascript:coll_add(5971070)">收藏</a>Console.WriteLine(node8.Id); //輸出 coll_add_aid59710701 獲取Id屬性的內(nèi)容Console.ReadKey();}三、方法
IEnumerable<HtmlNode> Ancestors(); 返回此元素的所有上級節(jié)點(diǎn)的集合。
IEnumerable<HtmlNode> Ancestors(string name); ?返回此元素參數(shù)名字匹配的所有上級節(jié)點(diǎn)的集合。
IEnumerable<HtmlNode> AncestorsAndSelf(); 返回此元素的所有上級節(jié)點(diǎn)和自身的集合。
IEnumerable<HtmlNode> AncestorsAndSelf(string name); 返回此元素的名字匹配的所有上級節(jié)點(diǎn)和自身的集合。
HtmlNode AppendChild(HtmlNode newChild); ? 將參數(shù)元素追加到為調(diào)用元素的子元素(追加在最后)
void AppendChildren(HtmlNodeCollection newChildren); 將參數(shù)集合中的元素追加為調(diào)用元素的子元素(追加在最后)
HtmlNode PrependChild(HtmlNode newChild); ? ?將參數(shù)中的元素作為子元素,放在調(diào)用元素的最前面
void PrependChildren(HtmlNodeCollection newChildren); 將參數(shù)集合中的所有元素作為子元素,放在調(diào)用元素前面
static bool CanOverlapElement(string name); ?確定是否可以保存重復(fù)的元素
IEnumerable<HtmlAttribute> ChildAttributes(string name); 獲取所有子元素的屬性(參數(shù)名要與元素名匹配)
HtmlNode Clone(); 本節(jié)點(diǎn)克隆到一個新的節(jié)點(diǎn)
HtmlNode CloneNode(bool deep); 節(jié)點(diǎn)克隆到一個新的幾點(diǎn),參數(shù)確定是否連子元素一起克隆
HtmlNode CloneNode(string newName); 克隆的同時更改元素名
HtmlNode CloneNode(string newName, bool deep); ?克隆的同時更改元素名。參數(shù)確定是否連子元素一起克隆
void CopyFrom(HtmlNode node); ?創(chuàng)建重復(fù)的節(jié)點(diǎn)和其下的子樹。
void CopyFrom(HtmlNode node, bool deep); ?創(chuàng)建節(jié)點(diǎn)的副本。
XPathNavigator CreateNavigator(); 返回的一個對于此文檔的XPathNavigator?
static HtmlNode CreateNode(string html); ? 靜態(tài)方法,允許用字符串創(chuàng)建一個新節(jié)點(diǎn)
XPathNavigator CreateRootNavigator(); 創(chuàng)建一個根路徑的XPathNavigator?
IEnumerable<HtmlNode> DescendantNodes(); 獲取所有子代節(jié)點(diǎn)
IEnumerable<HtmlNode> DescendantNodesAndSelf(); 獲取所有的子代節(jié)點(diǎn)以及自身
IEnumerable<HtmlNode> Descendants(); 獲取枚舉列表中的所有子代節(jié)點(diǎn)
IEnumerable<HtmlNode> Descendants(string name); 獲取枚舉列表中的所有子代節(jié)點(diǎn),注意元素名要與參數(shù)匹配
IEnumerable<HtmlNode> DescendantsAndSelf(); 獲取枚舉列表中的所有子代節(jié)點(diǎn)以及自身
IEnumerable<HtmlNode> DescendantsAndSelf(string name); ?獲取枚舉列表中的所有子代節(jié)點(diǎn)以及自身,注意元素名要與參數(shù)匹配
HtmlNode Element(string name); ?根據(jù)參數(shù)名獲取一個元素
IEnumerable<HtmlNode> Elements(string name); 根據(jù)參數(shù)名獲取匹配的元素集合
bool GetAttributeValue(string name, bool def); ?幫助方法,用來獲取此節(jié)點(diǎn)的屬性的值(布爾類型)。如果未找到該屬性,則將返回默認(rèn)值。
int GetAttributeValue(string name, int def); ?幫助方法,用來獲取此節(jié)點(diǎn)的屬性的值(整型)。如果未找到該屬性,則將返回默認(rèn)值。
string GetAttributeValue(string name, string def); 幫助方法,用來獲取此節(jié)點(diǎn)的屬性的值(字符串類型)。如果未找到該屬性,則將返回默認(rèn)值。
HtmlNode InsertAfter(HtmlNode newChild, HtmlNode refChild); ?將一個節(jié)點(diǎn)插入到第二個參數(shù)節(jié)點(diǎn)的后面,與第二個參數(shù)是兄弟關(guān)系
HtmlNode InsertBefore(HtmlNode newChild, HtmlNode refChild); 講一個節(jié)點(diǎn)插入到第二個參數(shù)節(jié)點(diǎn)的后面,與第二個參數(shù)是兄弟關(guān)系
static bool IsCDataElement(string name); ?確定是否一個元素節(jié)點(diǎn)是一個 CDATA 元素節(jié)點(diǎn)。
static bool IsClosedElement(string name); 確定是否封閉的元素節(jié)點(diǎn)
static bool IsEmptyElement(string name); ? ?確定是否一個空的元素節(jié)點(diǎn)。
static bool IsOverlappedClosingElement(string text); ?確定是否文本對應(yīng)于一個節(jié)點(diǎn)可以保留重疊的結(jié)束標(biāo)記。
void Remove(); ?從父集合中移除調(diào)用節(jié)點(diǎn)
void RemoveAll(); ?移除調(diào)用節(jié)點(diǎn)的所有子節(jié)點(diǎn)以及屬性
void RemoveAllChildren(); ?移除調(diào)用節(jié)點(diǎn)的所有子節(jié)點(diǎn)
HtmlNode RemoveChild(HtmlNode oldChild); ?移除調(diào)用節(jié)點(diǎn)的指定名字的子節(jié)點(diǎn)
HtmlNode RemoveChild(HtmlNode oldChild, bool keepGrandChildren);移除調(diào)用節(jié)點(diǎn)調(diào)用名字的子節(jié)點(diǎn),第二個參數(shù)確定是否連孫子節(jié)點(diǎn)一起移除
HtmlNode ReplaceChild(HtmlNode newChild, HtmlNode oldChild); 將調(diào)用節(jié)點(diǎn)原有的一個子節(jié)點(diǎn)替換為一個新的節(jié)點(diǎn),第二個參數(shù)是舊節(jié)點(diǎn)
HtmlNodeCollection SelectNodes(string xpath); 根據(jù)XPath獲取一個節(jié)點(diǎn)集合
HtmlNode SelectSingleNode(string xpath); 根據(jù)XPath獲取唯一的一個節(jié)點(diǎn)
HtmlAttribute SetAttributeValue(string name, string value); ?設(shè)置調(diào)用節(jié)點(diǎn)的屬性
string WriteContentTo(); ?將該節(jié)點(diǎn)的所有子級都保存到一個字符串中。
void WriteContentTo(TextWriter outText); 將該節(jié)點(diǎn)的所有子級都保存到指定的 TextWriter。
string WriteTo(); 將當(dāng)前節(jié)點(diǎn)保存到一個字符串中。
void WriteTo(TextWriter outText); 將當(dāng)前節(jié)點(diǎn)保存到指定的 TextWriter。
void WriteTo(XmlWriter writer); ?將當(dāng)前節(jié)點(diǎn)保存到指定的則 XmlWriter。
示例代碼:
static void Main(string[] args){//<ul class="user_match clear">// <li>年齡:21~30之間</li>// <li>婚史:未婚</li>// <li>地區(qū):不限</li>// <li>身高:175~185厘米之間</li>// <li>學(xué)歷:不限</li>// <li>職業(yè):不限</li>// <li>月薪:不限</li>// <li>住房:不限</li>// <li>購車:不限</li>//</ul>WebClient wc = new WebClient();wc.BaseAddress = "http://www.juedui100.com/";wc.Encoding = Encoding.UTF8;HtmlDocument doc = new HtmlDocument();string html = wc.DownloadString("user/6971070.html");doc.LoadHtml(html);HtmlNode node = doc.DocumentNode.SelectSingleNode("/html/body/div[4]/div[1]/div[2]/ul[1]"); //根據(jù)XPath查找節(jié)點(diǎn),跟XmlNode差不多IEnumerable<HtmlNode> nodeList = node.Ancestors(); //獲取該元素所有的父節(jié)點(diǎn)的集合foreach (HtmlNode item in nodeList){Console.Write(item.Name + " "); //輸出 div div body html #document}Console.WriteLine();IEnumerable<HtmlNode> nodeList1 = node.Ancestors("body"); //獲取名字匹配的該元素的父集合,其實(shí)參數(shù)就是一個篩選的功能foreach (HtmlNode item in nodeList1){Console.Write(item.Name + " "); //輸出 body}Console.WriteLine();IEnumerable<HtmlNode> nodeList2 = node.AncestorsAndSelf(); //獲取所有的父節(jié)點(diǎn)和自身foreach (HtmlNode item in nodeList2){Console.Write(item.Name + " "); //輸出 ul div div div body html #document}Console.WriteLine();IEnumerable<HtmlNode> nodeList3 = node.AncestorsAndSelf("div"); //獲取父節(jié)點(diǎn)和自身,參數(shù)用于篩選foreach (HtmlNode item in nodeList3){Console.Write(item.Name + " "); //輸出 div div div}Console.WriteLine();HtmlNode node1 = doc.CreateElement("li");node1.InnerHtml = "我是附加的li元素";node.AppendChild(node1); //...<li>購車:不限</li> 后面加了一個<li>我是附加的li元素</li>Console.WriteLine(node.InnerHtml);HtmlNode node2 = doc.CreateElement("li");node2.InnerHtml = "新li一";HtmlNode node3 = doc.CreateElement("li");node3.InnerHtml = "新li二";HtmlNodeCollection nc = new HtmlNodeCollection(node2);nc.Add(node2);nc.Add(node3);node.AppendChildren(nc); //一次過追加多個元素Console.WriteLine(node.InnerHtml); //...<li>我是附加的li元素</li><li>新li一</li><li>新li二</li>Console.WriteLine(HtmlNode.CanOverlapElement("node2")); //輸出False 確定是否可以保存一個重復(fù)的元素IEnumerable<HtmlAttribute> attrs = node.ChildAttributes("class"); //獲取子節(jié)點(diǎn)與自身的所有名為class的屬性集合foreach (HtmlAttribute attr in attrs){Console.Write(attr.Value); //輸出 user_match clear }HtmlNode node4 = node.Clone();Console.WriteLine(node4.InnerHtml); //輸出node的代碼,node已被復(fù)制到了nodeHtmlNode node5 = node.CloneNode(false); //參數(shù)決定是否復(fù)制子節(jié)點(diǎn),與XmlNode一樣Console.WriteLine(node5.OuterHtml); //<ul class="user_match clear"></ul> 因?yàn)閰?shù)設(shè)為了false子節(jié)點(diǎn)沒有被復(fù)制HtmlNode node6 = node.CloneNode("div"); //復(fù)制節(jié)點(diǎn)的同時,更改名字Console.WriteLine(node6.OuterHtml); //輸出 <div class="user_match clear"><li>年齡:21~30之間</li>...</div> ul已被改為了divHtmlNode node7 = node.CloneNode("table",false);Console.WriteLine(node7.OuterHtml); //輸出<table class="user_match clear"></table> 參數(shù)為false所以沒有復(fù)制子節(jié)點(diǎn)HtmlNode node8 = node.SelectSingleNode("child::li[1]");node.CopyFrom(node);Console.WriteLine(node.OuterHtml);Console.WriteLine("========================");//public void CopyFrom(HtmlNode node);//public void CopyFrom(HtmlNode node, bool deep);//public XPathNavigator CreateNavigator();//public XPathNavigator CreateRootNavigator();HtmlNode node9 = HtmlNode.CreateNode("<li>新節(jié)點(diǎn)</li>"); //直接用字符串創(chuàng)建節(jié)點(diǎn),還是挺好用的Console.WriteLine(node9.OuterHtml); //輸出 <li>新節(jié)點(diǎn)</li>IEnumerable<HtmlNode> nodeList4 = node.DescendantNodes(); //獲取所有的子節(jié)點(diǎn)集合foreach (HtmlNode item in nodeList4){Console.Write(item.OuterHtml); //輸出 node的每個子li節(jié)點(diǎn)}Console.WriteLine("===================");IEnumerable<HtmlNode> nodeList5 = node.DescendantNodesAndSelf();foreach (HtmlNode item in nodeList5){Console.Write(item.OuterHtml); //輸出自身<ul>..包括子節(jié)點(diǎn)<li>...</li></ul> 再輸出所有的子li節(jié)點(diǎn)}Console.WriteLine();IEnumerable<HtmlNode> nodeList6 = node.DescendantNodes(); //獲取枚舉列表中的所有子代節(jié)foreach (HtmlNode item in nodeList6){Console.Write(item.InnerText); //輸出所有的li節(jié)點(diǎn)的內(nèi)容}Console.WriteLine("---------------");IEnumerable<HtmlNode> nodeList7 = node.Descendants("li"); //獲取所有的子后代元素 //文本節(jié)點(diǎn)不在此范圍內(nèi)foreach(HtmlNode item in nodeList7){Console.Write(item.InnerText); }IEnumerable<HtmlNode> nodeList8 = node.DescendantsAndSelf("ul"); //獲取所有的子后代元素 //文本節(jié)點(diǎn)不在此范圍內(nèi)foreach (HtmlNode item in nodeList8){Console.Write(item.Name); //輸出 ul 參數(shù)實(shí)際上只相當(dāng)于過濾的作用}HtmlNode node10 = node.Element("li"); //獲取第一個子節(jié)點(diǎn)名稱匹配的元素Console.WriteLine(node10.InnerText); //輸出 年齡:年齡:21~30之間Console.WriteLine("----------------------------------------");IEnumerable<HtmlNode> nodeList9 = node.Elements("li");foreach (HtmlNode item in nodeList9){Console.Write(item.InnerText); //輸出 所有的li節(jié)點(diǎn)內(nèi)容}Console.WriteLine();//換一個新的,好像有點(diǎn)亂了HtmlNode newnode = doc.DocumentNode.SelectSingleNode("/html/body/div[4]/div[1]/div[3]");//<div class="col say">// <h3>愛情獨(dú)白</h3>// <p>愿得一心人,白首不相離。我一直相信我的另一半就在茫茫人海中,有一天一定會與我相遇。</p>//</div>//bool b = newnode.GetAttributeValue("class", false); //獲取一個布爾值的屬性,沒有找到則返回第二個參數(shù)的默認(rèn)值//Console.WriteLine(b);//int i = newnode.GetAttributeValue("class", 0); //獲取一個整形的屬性,沒有找到則返回第二個參數(shù)的默認(rèn)值//Console.WriteLine(i);string str = newnode.GetAttributeValue("class", ""); //獲取一個字符串屬性Console.WriteLine(str); //輸出 col sayHtmlNode node11 = HtmlNode.CreateNode("<b>我是加粗節(jié)點(diǎn)</b>");HtmlNode node12 = newnode.SelectSingleNode("h3");newnode.InsertAfter(node11, node12); //意思是在node12代表的h3節(jié)點(diǎn)后面插入node11節(jié)點(diǎn)Console.WriteLine(newnode.InnerHtml); //h3>愛情獨(dú)白</h3><b>我是加粗節(jié)點(diǎn)</b><p>愿得一心人... 留意到b節(jié)點(diǎn)已經(jīng)被插入到h3后面newnode.InsertBefore(node11, node12); //再插入多一次,方法不同罷了,這次是在node12帶包的h3前面插入Console.WriteLine(newnode.InnerHtml); //<b>我是加粗節(jié)點(diǎn)</b><h3>愛情獨(dú)白</h3><b>我是加粗節(jié)點(diǎn)</b><p>愿得一心人Console.WriteLine("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");newnode.RemoveChild(node11); //移除了第一個<b>我是加粗節(jié)點(diǎn)</b> 此方法的重載,第二個參數(shù)決定是否移除孫子節(jié)點(diǎn)Console.WriteLine(newnode.InnerHtml); //<h3>愛情獨(dú)白</h3><b>我是加粗節(jié)點(diǎn)</b><p>愿得一心人....newnode.RemoveAllChildren(); //移除所有子節(jié)點(diǎn)Console.WriteLine(newnode.OuterHtml); //<div class="col say"></div> 所有子節(jié)點(diǎn)都被移除了newnode.RemoveAll(); //移除所有的屬性和子節(jié)點(diǎn),由于子節(jié)點(diǎn)已經(jīng)被上個方法移除了,因此這次連屬性也移除了Console.WriteLine(newnode.OuterHtml); //輸出 <div></div> 注意到屬性也被移除了。//都移除光了,再來一個,還是剛才那個HtmlNode newnode1 = doc.DocumentNode.SelectSingleNode("/html/body/div[4]/div[1]/div[3]");Console.WriteLine("===================");Console.WriteLine(newnode1.OuterHtml); //輸出 <div></div> 注意 移除是從HtmlDocument中移除的,再次獲取獲取不到了HtmlNode newnode2 = doc.DocumentNode.SelectSingleNode("/html/body/div[4]/div[1]/div[2]/div[2]/p");Console.WriteLine(newnode2.OuterHtml);//<p class="no_tip">她還沒有設(shè)置不能忍受清單 // <a href="javascript:invite(5971070,8,'邀請?jiān)O(shè)置不能忍受');" class="link_b needlogin">邀請她設(shè)置</a>//</p>newnode2.Remove(); //從文檔樹中移除newnode2節(jié)點(diǎn)HtmlNode newnode3 = doc.DocumentNode.SelectSingleNode("/html/body/div[4]/div[1]/div[2]/div[2]/p"); //再次獲取該節(jié)點(diǎn)//Console.WriteLine(newnode3.OuterHtml); //報未將對象引用到對象的實(shí)例異常,明顯是找不到了,HtmlNode newnode4 = doc.DocumentNode.SelectSingleNode("/html/body/div[4]/div[1]/div[1]/div/div[1]/p[2]/b[1]");Console.WriteLine(newnode4.OuterHtml);//<b>相冊:// <a href="/photo/6971070.html" class="red">4</a>張//</b>HtmlNode node17 = HtmlNode.CreateNode("<div>再次創(chuàng)建一個節(jié)點(diǎn)</div>");newnode4.PrependChild(node17); //跟AppengChild類似,只是插入位置不同PrependChildren接受一個節(jié)點(diǎn)集合,一次過插入多個節(jié)點(diǎn)而已Console.WriteLine(newnode4.OuterHtml); //輸出//<b>相冊:// <div>再次創(chuàng)建一個節(jié)點(diǎn)</div>// <a href="/photo/6971070.html" class="red">4</a>張//</b>HtmlNode node16 = newnode4.SelectSingleNode("child::a[1]");HtmlNode node18 = HtmlNode.CreateNode("<p>新建一行</p>");newnode4.ReplaceChild(node18, node16);Console.WriteLine(newnode4.OuterHtml);//輸出//<b>相冊:// <div>再次創(chuàng)建一個節(jié)點(diǎn)</div>// <p>新建一行</p>張 //留意到node16代表得節(jié)點(diǎn)已經(jīng)被替換掉了//</b>HtmlNode node19 = newnode4.SelectSingleNode("child::p[1]");node19.SetAttributeValue("class","class1");Console.WriteLine(node19.OuterHtml); //輸出 <p class="class1">新建一行</p>Console.WriteLine(HtmlNode.IsOverlappedClosingElement("<a>我愛你</a>")); //輸出 FalseConsole.WriteLine(HtmlNode.IsCDataElement("<a>我愛你</a>")); //輸出 FalseConsole.WriteLine(HtmlNode.IsClosedElement("<a>我愛你</a>")); //輸出 FalseConsole.WriteLine(HtmlNode.IsEmptyElement("<a>我愛你</a>")); //輸出 FalseConsole.WriteLine(newnode4.OuterHtml);HtmlNode node20 = HtmlNode.CreateNode("<p>新的第二行</p>");newnode4.AppendChild(node20);HtmlNodeCollection hnc = newnode4.SelectNodes("//p"); //根據(jù)XPath一次過獲取多個NodeConsole.WriteLine(hnc.Count); //輸出29string str1 = node20.WriteContentTo();Console.WriteLine(str1); //輸出 新的第二行 將節(jié)點(diǎn)內(nèi)容寫入字符串//public void WriteContentTo(TextWriter outText);//public string WriteTo();//public void WriteTo(TextWriter outText);//public void WriteTo(XmlWriter writer);Console.ReadKey();}?
轉(zhuǎn)載于:https://www.cnblogs.com/dekevin/p/4042436.html
總結(jié)
以上是生活随笔為你收集整理的HtmlAgilityPack 之 HtmlNode类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Socket支持多用户并发访问的解决办法
- 下一篇: (王道408考研操作系统)第五章输入/输