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;
这里我们可以获取到一个HtmlNodeNavigator的node,这个node不是指向a标签,而是直接指向href属性,所以我们直接拿node.Value就可以获取到真正的href的值了
HtmlAgilityPack中使用xpath获取属性值的更多相关文章
- dom4j修改,获取,增加xml中某个元素的属性值
XML文件: <?xml version="1.0" encoding="UTF-8"?> <vrvscript> <item I ...
- storm源码之巧用java反射反序列化clojure的defrecord获取属性值
[原创]storm源码之巧用java反射反序列化clojure的defrecord获取属性值 [原创]storm源码之巧用java反射反序列化clojure的defrecord获取属性值 storm源 ...
- ajax获得后台传来的一个json值,在js中获得其中的属性值
首先 ajax的dataType需要设置为json, 默认的text获取属性值在jquery3.2.1中尝试不成功 获得属性值的方式: 类似数组,键值对的方式 下面例子: 设置dataType为jso ...
- JavaScript 在函数中使用Ajax获取的值作为函数的返回值
解决:JavaScript 在函数中使用Ajax获取的值作为函数的返回值,结果无法获取到返回值 原因:ajax默认使用异步方式,要将异步改为同步方式 案例:通过区域ID,获取该区域下所有的学校 var ...
- C# 反射获取属性值、名称、类型以及集合的属性值、类型名称
实体类 class Product { public string Id { get; set; } public string Name { get; set; } public List<P ...
- java 反射机制--根据属性名获取属性值
1.考虑安全访问范围内的属性,没有权限访问到的属性不读取 /** * 根据属性名获取属性值 * * @param fieldName * @param object * @return */ priv ...
- 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 ...
- js中attr 与find 获取属性值,
一.attr的用法 1. attr(属性名) //获取属性的值(取得第一个匹配元素的属性值.通过这个方法可以方便地从第一个匹配元素中获取一个属性的值.如果元素没有相应属性,则返回 und ...
- javascript_获取iframe框架中元素节点的属性值
1. DOM:文档对象模型 [window 对象] 它是一个顶层对象,而不是另一个对象的属性即浏览器的窗口. [document 对象] 该对象是window和frames对象的一个属性,是显示于窗口 ...
随机推荐
- 弃用!Github 上用了 Git.io 缩址服务的都注意了
GitHub 是面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 GitHub.对程序员来说,GitHub 可以说是开源精神之所系.在 GitHub 任何职业程 ...
- 【Java面试】Zookeeper中的Watch机制的原理?
一个工作了7年的粉丝,遇到了一个Zookeeper的问题. 因为接触过Zookeeper这个技术,不知道该怎么回答. 我说一个工作了7年的程序员,没有接触过主流技术,这不正常. 于是我问了他工资以后, ...
- 移动应用开发迎来哪些新技术?5月24日相约HDD·线上沙龙·创新开发专场
HUAWEI Developer Day(简称HDD),是华为开发者联盟与广大开发者深度交流的平台.围绕移动终端的最新技术和产品形态,持续向广大开发者传递华为终端的最新产品和开放服务能力,结合最新的行 ...
- vagrant,VirtualBox -- 安装使用
1.安装Oracle VM VirtualBox下载 http://download.virtualbox.org/virtualbox/5.2.44/ 2.安装vagrant https://www ...
- 312. Burst Balloons - LeetCode
Question https://leetcode.com/problems/burst-balloons/description/ Solution 题目大意是,有4个气球,每个气球上有个数字,现在 ...
- 使用acme.sh自动申请、续期、部署免费的SSL证书
参考文档:https://github.com/acmesh-official/acme.sh 一个使用纯shell操作的免费SSL证书申请部署工具. 免费的SSL证书由以下CA机构提供: ZeroS ...
- C++调用C#的动态库dll
以往我们经常是需要使用C#来调用C++的dll,这通过PInvoke就能实现.现在在实际的项目过程中,有时会遇到在C++的项目中调用某个C#的dll来完成特定的某个功能,我们都知道,Native C+ ...
- ElasticSearch7.3学习(三十)----ES7.X SQL新特性解析及使用Java api实现sql功能
一.ES7 sql新特性 1.1 数据准备 创建索引及映射 建立价格.颜色.品牌.售卖日期 四个字段 PUT /tvs PUT /tvs/_mapping { "properties&quo ...
- python基础学习9
python基础学习 内容概要 字符编码的简介 字符编码的发展史 字符编码的实际应用 文件操作简介 文件读写模式 文件操作模式 文件操作方法 内容详情 字符编码的简介 # 字符编码主要研究的对象是文本 ...
- EasyExcel-合并单元格
pom版本 <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</ ...