乐趣区

关于javascript:HtmlAgilityPack中使用xpath获取属性值

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;
退出移动版