這兩天用到了Html Agility Pack解析html,這東西官方沒有文檔,不過網上還是有很多資料的,雖然雷同總比沒有好.它的網站是 http://htmlagilitypack.codeplex.com
下載下來是一個dll文件直接在工程裏引用就可以了.
第一步,加載HTML文件
加載主是HtmlDocument類的load方法完成,裏面提供了多種加載方式,看方法的參數類型就一目瞭然了,主要分兩類從Stream和物理路徑path加載
public void Load(Stream stream);
public void Load(TextReader reader);
public void Load(Stream stream, bool detectEncodingFromByteOrderMarks);
public void Load(Stream stream, Encoding encoding); //指定了編碼格式
public void Load(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks);
public void Load(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize);
public void Load(string path);
public void Load(string path, bool detectEncodingFromByteOrderMarks);
public void Load(string path, Encoding encoding);
public void Load(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks);
public void Load(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize);
public void LoadHtml(string html);//直接從html字符串加載,這個用的比較多的
//從字符串加載
HtmlDocument doc = new HtmlDocument();
string html = "<div id="wapper"><h1>Hello World!</h1><p>article content</p></div>";
doc.LoadHtml(html);
第二步,解析html
首先需要了解幾個相關的類和方法
HtmlNode 表示一個節點
HtmlNodeCollection 表示一個節點集合
DocumentNode 文檔根節點,本身也是一個HtmlNode
HtmlAttribute 表示節點屬性
string htmlstr="<div id=\"wapper\"><><p id=\"pid\">article content...</p><p>article content...article content...</p></div>"
HtmlDocument parser = new HtmlDocument();
parser.LoadHtml(htmlstr);
//使用xpath表達式查找所有P標籤
HtmlNodeCollection nodes = parser.DocumentNode.SelectNodes("//p");
foreach (HtmlNode tmpNode in nodes)
{
if (tmpNode.Attributes["pid= null)
{
//取節點屬性ID的值
string pid = tmpNode.Attributes["pid"].value;
string text = tmpNode.InnerText;
//創建一個新節點
HtmlNode newNode = HtmlNode.CreateNode("<font size=" + size + ">" + text + "</font>");
//替換子節點
tmpNode.ParentNode.ReplaceChild(newNode, tmpNode);
}
else
{
HtmlNode rvNode = tmpNode.ParentNode.RemoveChild(tmpNode, true); //刪除標籤,但保留標籤內文本
}
}
這裏要注意的是在獲取屬性值時,如果某一個屬性名稱不存在的話,Attributes["attriname"]返回的是null值
HtmlNode類的屬性
Attributes 獲取節點的屬性集合
ChildNodes 獲取子節點集合(包括文本節點)
Closed 該節點是否已關閉(</xxx>)
ClosingAttributes 在關閉標籤的屬性集合
FirstChild 獲取第一個子節點
HasAttributes 判斷該節點是否含有屬性
HasChildNodes 判斷該節點是否含有子節點
HasClosingAttributes 判斷該節點的關閉標籤是否含有屬性(</xxx class="xxx">)
Id 獲取該節點的Id屬性
InnerHtml 獲取該節點的Html代碼
InnerText 獲取該節點的內容,與InnerHtml不同的地方在於它會過濾掉Html代碼,而InnerHtml是連Html代碼一起輸出
LastChild 獲取最後一個子節點
Line 獲取該節點的開始標籤或開始代碼位於整個HTML源代碼的第幾行(行號)
LinePosition 獲取該節點位於第幾列
Name Html元素名
NextSibling 獲取下一個兄弟節點
NodeType 獲取該節點的節點類型
OriginalName 獲取原始的未經更改的元素名
OuterHtml 整個節點的代碼
OwnerDocument 節點所在的HtmlDocument文檔
ParentNode 獲取該節點的父節點
PreviousSibling 獲取前一個兄弟節點
StreamPosition 該節點位於整個Html文檔的字符位置
XPath 根據節點返回該節點的XPath
HtmlNode類的重要方法
GetElementbyId(string id) 使用元素ID取得該元素
獲取父節點的系列方法:
1)public IEnumerable<HtmlNode> Ancestors()
獲取當前節點的父節點列表(不包含自身)。
2)public IEnumerable<HtmlNode> Ancestors(string name)
以指定一個名稱來獲取父節點的列表(不包含自身)。
3)public IEnumerable<HtmlNode> AncestorsAndSelf()
獲取當前節點的父節點列表(包含自身)。
4)public IEnumerable<HtmlNode> AncestorsAndSelf(string name)
以指定一個名稱來獲取父節點的列表(包含自身)。
獲取子節點的系列方法:
1)public IEnumerable<HtmlNode> DescendantNodes()
獲取當前節點下的所有子節點的列表,包括子節點的子節點(不包含自身)。
2)public IEnumerable<HtmlNode> DescendantNodesAndSelf()
獲取當前節點下的所有子節點的列表,包括子節點的子節點(包含自身)。
3)public IEnumerable<HtmlNode> Descendants()
獲取當前節點下的直接子節點的列表(不包含自身)。
4)public IEnumerable<HtmlNode> DescendantsAndSelf()
獲取當前節點下的直接子節點的列表(包含自身)。
5)public IEnumerable<HtmlNode> Descendants(string name)
獲取當前節點下的以指定名稱的子節點列表。
6)public IEnumerable<HtmlNode> DescendantsAndSelf(string name)
獲取當前節點下的以指定名稱的子節點的列表(包含自身)。
7)public HtmlNode Element(string name)
獲取第一個符合指定名稱的直接子節點的節點元素。
8)public IEnumerable<HtmlNode> Elements(string name)
獲取符合指定名稱的所有直接子節點的節點列表。
9)public HtmlNodeCollection SelectNodes(string xpath)
獲取符合指定的xpath的子節點列表。
10)public HtmlNode SelectSingleNode(string xpath)
獲取符合指定的xpath的單個字節點元素。
操作系列方法
public void Remove();
public void RemoveAll();
public void RemoveAllChildren();
public HtmlNode RemoveChild(HtmlNode oldChild);
public HtmlNode RemoveChild(HtmlNode oldChild, bool keepGrandChildren);//移除調用節點調用名字的子節點,第二個參數確定是否保留子孫節點
public HtmlNode ReplaceChild(HtmlNode newChild, HtmlNode oldChild);
//將調用節點原有的一個子節點替換爲一個新的節點
public HtmlNode InsertAfter(HtmlNode newChild, HtmlNode refChild);
public HtmlNode InsertBefore(HtmlNode newChild, HtmlNode refChild);
HtmlDocument類的重要方法
public HtmlAttribute CreateAttribute(string name);
public HtmlAttribute CreateAttribute(string name, string value);
public HtmlNode CreateElement(string name);
public XPathNavigator CreateNavigator();
public HtmlTextNode CreateTextNode();
public HtmlTextNode CreateTextNode(string text);
public HtmlNode GetElementbyId(string id);