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;