这两天用到了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);