HtmlAgilityPack介绍
HtmlAgilityPack是一个专门用来解析Html的库,它能够应用xml的形式来解析html。
有人说了,html自身不就是xml?是的,html就是xml,然而html很宽松,没有敞开的节点也能够用,还有一些其余的内容比方js夹杂在外面。如果间接应用xml解析库的话9成会报错的。
而HtmlAgilityPack会去解决这些问题,把Html转成一个靠近规范的xml来供咱们应用。
获取内容
网上对于HtmlAgilityPack的介绍其实很多,而且用法其实就那么几句话。
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html); var root = doc.DocumentNode;
这个也没啥好说的,次要就是doc.LoadHtml(html);这里有个重载是doc.Load(),外面能够间接放url,也能够放Stream。
咱们这里应用LoadHtml间接加载html内容次要是因为咱们的html拿的时候可能还须要别的货色,须要另行获取。
最初的var root = doc.DocumentNode;这个root就是<html>节点,整个html的根目录。
而后很多文章的说法就是咱们要获取Node,即应用
var node =root.SelectSingleNode("xpath");
这样必定是没问题的,而后咱们如果要取得它的属性,就能够拿这个Node的node.GetAttributeValue("name", 默认值);获取内容。
比方咱们要获取id为test的a标签的href,咱们能够写个例子
var doc = new HtmlAgilityPack.HtmlDocument(); doc.LoadHtml(html); var root = doc.DocumentNode; var node =root.SelectSingleNode("//a[@id='test']"); var href = GetAttributeValue("href", "");
这样咱们就能获取到href了。是不是很简略?
间接获取属性值
下面的例子看起来很好,然而有个比拟麻烦的问题,就是有时候咱们想间接获取属性值。比方我有一个这样的xpath //a[@id='test']/@href,如果咱们还用下面的代码套进去。
var doc = new HtmlAgilityPack.HtmlDocument(); doc.LoadHtml(html); var root = doc.DocumentNode; var node =root.SelectSingleNode("//a[@id='test']/@href");
咱们的node是不是就是href的值呢?通过测试,不是的,这里的node还是那个a。
所以咱们无奈间接这样来获取。
通过一番查问,发现HtmlAgilityPack提供了一个HtmlNodeNavigator来实现这个需要。
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html); var root = doc.DocumentNode; HtmlNodeNavigator navigator = (HtmlNodeNavigator)root.CreateNavigator(); var node = navigator.SelectSingleNode("//a[@id='test']/@href"); var href = node.Value;