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", 默认值);获取内容。

比如我们要获取idtesta标签的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;

这里我们可以获取到一个HtmlNodeNavigator的node,这个node不是指向a标签,而是直接指向href属性,所以我们直接拿node.Value就可以获取到真正的href的值了

HtmlAgilityPack中使用xpath获取属性值的更多相关文章

  1. dom4j修改,获取,增加xml中某个元素的属性值

    XML文件: <?xml version="1.0" encoding="UTF-8"?> <vrvscript> <item I ...

  2. storm源码之巧用java反射反序列化clojure的defrecord获取属性值

    [原创]storm源码之巧用java反射反序列化clojure的defrecord获取属性值 [原创]storm源码之巧用java反射反序列化clojure的defrecord获取属性值 storm源 ...

  3. ajax获得后台传来的一个json值,在js中获得其中的属性值

    首先 ajax的dataType需要设置为json, 默认的text获取属性值在jquery3.2.1中尝试不成功 获得属性值的方式: 类似数组,键值对的方式 下面例子: 设置dataType为jso ...

  4. JavaScript 在函数中使用Ajax获取的值作为函数的返回值

    解决:JavaScript 在函数中使用Ajax获取的值作为函数的返回值,结果无法获取到返回值 原因:ajax默认使用异步方式,要将异步改为同步方式 案例:通过区域ID,获取该区域下所有的学校 var ...

  5. C# 反射获取属性值、名称、类型以及集合的属性值、类型名称

    实体类 class Product { public string Id { get; set; } public string Name { get; set; } public List<P ...

  6. java 反射机制--根据属性名获取属性值

    1.考虑安全访问范围内的属性,没有权限访问到的属性不读取 /** * 根据属性名获取属性值 * * @param fieldName * @param object * @return */ priv ...

  7. How to: Calculate a Property Value Based on Values from a Detail Collection 如何:基于详细信息集合中的值计算属性值

    This topic describes how to implement a business class, so that one of its properties is calculated ...

  8. js中attr 与find 获取属性值,

    一.attr的用法 1. attr(属性名)        //获取属性的值(取得第一个匹配元素的属性值.通过这个方法可以方便地从第一个匹配元素中获取一个属性的值.如果元素没有相应属性,则返回 und ...

  9. javascript_获取iframe框架中元素节点的属性值

    1. DOM:文档对象模型 [window 对象] 它是一个顶层对象,而不是另一个对象的属性即浏览器的窗口. [document 对象] 该对象是window和frames对象的一个属性,是显示于窗口 ...

随机推荐

  1. 移动端input的disabled属性对字体颜色影响

    对于表单输入,input是很好的选择,这次记录主要是正对input的value值字体在Android和iOS(11)设备下显示不同问题: 如下图:1.2的区别主要是分别设置disabled.reado ...

  2. ansible模块的介绍与使用

    ansible-doc的使用 1.ansible-doc -h可以看见ansible-doc的所有参数 2.ansible-doc 命令格式:ansible-doc [-l|-F|-s] [optio ...

  3. 重修 Slope Trick(看这篇绝对够!)

    Slope Trick 算法存在十余载了,但是我没有找到多少拍手叫好的讲解 blog,所以凭借本人粗拙的理解来写这篇文章. 本文除标明外所有图片均为本人手绘(若丑见谅),画图真的不容易啊 qwq(无耻 ...

  4. wlile、 for循环和基本数据类型及内置方法

    while + else 1.while与else连用 当while没有被关键字break主动结束的情况下 正常结束循环体代码之后执行else的子代码 """ while ...

  5. 一条Sql的执行过程

    一条sql内部是如何执行的: 学习MySQL实战45专栏 sql中的内部执行图: 可以分为两部分:server和存储引擎 server层包含: 连接器.分析器.优化器.执行器,涵盖了MySQL大多数核 ...

  6. mybatis xml 中 trim 多余的符号

    <if test="(mac != null and mac != '') or (roomNo != null and roomNo != '') or (bedNo != null ...

  7. 用python实现输入三边判断能否组成三角形

    # -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'sanjiaoxing.py'## Creat ...

  8. 【HEOI2014】大工程<虚树>

    虚树 我们每天都用心思索着,这究竟是为了什么呢?我想我也不知道,只是觉得如果人不思考问题就很无聊. 我觉得虚树不是什么数据结构,就是一种技巧或者工具.它能把树中\(k\)个关键点以\(O(klogk) ...

  9. GO GMP协程调度实现原理 5w字长文史上最全

    1 Runtime简介 Go语言是互联网时代的C,因为其语法简洁易学,对高并发拥有语言级别的亲和性.而且不同于虚拟机的方案.Go通过在编译时嵌入平台相关的系统指令可直接编译为对应平台的机器码,同时嵌入 ...

  10. 『忘了再学』Shell流程控制 — 39、特殊流程控制语句

    目录 1.特殊流程控制语句介绍 2.exit语句 3.break语句 4.continue语句 1.特殊流程控制语句介绍 Shell程序或者说其他的程序,都是顺序执行的,也就是第一行执行完再执行第二行 ...