HtmlDocument類對應着一個HTML文檔代碼。它提供了創建文檔,裝載文檔,修改文檔等等一系列功能,來看看它提供的功能。
一、屬性
int CheckSum { get; } 如果 OptionComputeChecksum 設置為 true 之前解析,0 否則獲取文檔 CRC32 校驗和。
Encoding DeclaredEncoding { get; } 獲取文檔的聲明的編碼。聲明確定編碼使用 meta http-equiv ="內容類型"內容 ="文本/html ; charset = XXXXX"html 節點。
HtmlNode DocumentNode { get; } 獲取文檔的根節點。
Encoding Encoding { get; } 獲取文檔的輸出編碼。
IEnumerable<HtmlParseError> ParseErrors { get; } 獲取文檔在解析過程中,發現的解析錯誤集合
string Remainder { get; } 獲取剩余的文本。如果 OptionStopperNodeName 為空,此屬性將始終為空。
int RemainderOffset { get; } 獲取原始 Html 文本中其余部分的偏移量。如果 OptionStopperNodeName 為 null,這將返回原始 Html 文本的長度。
Encoding StreamEncoding { get; } 獲取文檔的流的編碼。
二、方法
HtmlAttribute CreateAttribute(string name); 創建一個屬性,指定名稱
HtmlAttribute CreateAttribute(string name, string value); 創建一個屬性,指定名稱和值
HtmlCommentNode CreateComment(); 創建一個空的注釋節點
HtmlCommentNode CreateComment(string comment); 使用指定的名稱創建一個注釋節點
HtmlNode CreateElement(string name); 使用指定的名稱創建一個 HTML 元素節點。
XPathNavigator CreateNavigator(); 創建一個XPathNavigator 對象
HtmlTextNode CreateTextNode(); 創建一個文本節點
HtmlTextNode CreateTextNode(string text); 創建一個文本節點,並用參數的值賦值
Encoding DetectEncoding(Stream stream); 檢測到的 HTML 流的編碼。
Encoding DetectEncoding(string path); 檢測編碼的 HTML 文本。
Encoding DetectEncoding(TextReader reader); 檢測到的關於 TextReader 提供 HTML 文本的編碼。
void DetectEncodingAndLoad(string path); 檢測到第一,從一個文件的 HTML 文檔的編碼,然后加載該文件。
void DetectEncodingAndLoad(string path, bool detectEncoding); 檢測到第一,從一個文件的 HTML 文檔的編碼,然后加載該文件。
Encoding DetectEncodingHtml(string html); 檢測編碼的 HTML 文本。
HtmlNode GetElementbyId(string id); 根據Id查找一個節點
static string GetXmlName(string name); 獲取一個有效的 XML 名稱。
static string HtmlEncode(string html); 靜態方法,對一個字符串進行HTML編碼
static bool IsWhiteSpace(int c); 確定指定的字符是否是一個空白字符。
void Load(Stream stream); 從流中加載一個文檔
void Load(string path); 從路徑中加載一個文檔
void Load(TextReader reader);
void Load(Stream stream, bool detectEncodingFromByteOrderMarks);
void Load(Stream stream, Encoding encoding);
void Load(string path, bool detectEncodingFromByteOrderMarks);
void Load(string path, Encoding encoding);
void Load(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks);
void Load(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks);
void Load(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize);
void Load(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize);
void LoadHtml(string html); 從字符串中加載一個文檔
void Save(Stream outStream); 將當前HTML文檔保存入流
void Save(StreamWriter writer);
void Save(string filename); 將HTML文檔保存到指定的路徑
void Save(TextWriter writer);
void Save(XmlWriter writer);
void Save(Stream outStream, Encoding encoding);
void Save(string filename, Encoding encoding);
屬性代碼示例:
static void Main(string[] args) { 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); int i = doc.CheckSum; //如果 OptionComputeChecksum 設置為 true 之前解析,0 否則獲取文檔 CRC32 校驗和。 Console.WriteLine(i); //輸出 0 Encoding enc = doc.DeclaredEncoding; //獲取文檔的聲明的編碼。 Console.WriteLine(enc.BodyName); //輸出 utf-8 HtmlNode node = doc.DocumentNode; //獲取文檔的根節點 Console.WriteLine(node.Name); //輸出 #document Encoding enc1 = doc.Encoding; //獲取文檔的輸出編碼 Console.WriteLine(enc1.BodyName); //輸出utf-8 IEnumerable<HtmlParseError> eList = doc.ParseErrors; //文檔在解析過程中發現的解析錯誤集合 string str = doc.Remainder; //獲取剩余的文本。 Console.WriteLine(str); //什么都沒輸出 int offset = doc.RemainderOffset; //獲取原始 Html 文本中其余部分的偏移量。 Console.WriteLine(offset); //輸出 25762 Encoding enc2 = doc.StreamEncoding; Console.WriteLine(enc2.BodyName); Console.ReadKey(); }
方法代碼示例:
用於測試的HTML代碼:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> </head> <body> </body> </html>
主程序代碼:
static void Main(string[] args) { HtmlDocument doc = new HtmlDocument(); doc.Load(@"D:\1234.html"); //此方法有11個重載,支持各種加載Html文檔 //Console.WriteLine(doc.DocumentNode.InnerHtml); 已經加載成功,輸出D:123.html的頁面代碼 HtmlNode node1 = doc.CreateElement("div"); //本文檔創建一個節點 node1.InnerHtml = "我是一個div"; doc.DocumentNode.SelectSingleNode("//body").AppendChild(node1); //將節點追加到body里 HtmlAttribute attr = doc.CreateAttribute("class", "class1"); doc.DocumentNode.SelectSingleNode("/html/body/div[1]").Attributes.Add(attr); //此方法也可以用兩個參數添加。 //以上代碼執行之后 body里的內容變為 <body><div class="class1">我是一個div</div></body> 看到屬性又被添加進去了 HtmlCommentNode cNode = doc.CreateComment(); cNode.Comment = "<!--這是一段注釋-->"; //應該不是這樣寫的吧?可能是我寫錯了,先跳過這一段 doc.DocumentNode.SelectSingleNode("/html/body/div[1]").AppendChild(cNode); //雖然達到了目的,但是應該不是這樣寫的吧 //執行之后 //<body> // <div class="class1">我是一個div<!--這是一段注釋--></div> 留意到注釋節點已添加進去了 //</body> HtmlTextNode tNode = doc.CreateTextNode("我是一個文本節點"); doc.DocumentNode.SelectSingleNode("/html/body/div[1]").AppendChild(tNode); //執行之后 //<body> // <div class="class1">我是一個div<!--這是一段注釋-->我是一個文本節點</div> //留意到文本節點已添加進去了 //</body> Encoding enc = doc.DetectEncoding(@"D:\1234.html"); //3個重載,應該是從流中,TextWriter中和 路徑中檢測編碼 //Console.WriteLine(enc.BodyName); //獲取不到對象,不知道哪里錯了 HtmlNode node = doc.CreateElement("p"); node.InnerHtml = "我是一個p"; HtmlAttribute attr2 = doc.CreateAttribute("id","id1"); node.Attributes.Add(attr2); doc.DocumentNode.AppendChild(node); HtmlNode node2 = doc.GetElementbyId("id1"); //根據Id查找節點 Console.WriteLine(node2.InnerText); //輸出 我是一個p string strHtml = "<b>我是一個加粗節點</b>"; string s = HtmlDocument.HtmlEncode(strHtml); Console.WriteLine(s); //輸出 <b>我是一個加粗節點</b> 這是經過HTML編碼的字符串 string str = HtmlDocument.GetXmlName("<sss"); //根據字符串獲取一個有效的XML名稱 Console.WriteLine(str); //輸出 _3c_sss Console.WriteLine(HtmlDocument.IsWhiteSpace(10)); //True Console.WriteLine(HtmlDocument.IsWhiteSpace(101)); //False doc.Save(@"D:\123.html"); //Save方法有多個重載,可以通過流,路徑,並且還能指定編碼等等。 HtmlDocument doc1 = new HtmlDocument(); string html = File.ReadAllText(@"D:\123.html"); doc1.LoadHtml(html); //此方法表示從一個字符串中載入HtmlDocument Console.ReadKey(); }
