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;