Python_XPath
文章目录
- 简介
- XPath节点
- XPath语法
- XPath轴
- XPath运算符
简介
XPath是一门在XML文档中查找信息的语言,被用于在XML文档中通过元素和属性进行导航。XPath虽然是被设计用来搜索XML文档,不过它也能很好地在HTML文档中工作,并且大部分浏览器也支持通过XPath来查询节点。在Python爬虫开发中,经常使用XPath查找提取网页中的信息,因此XPath非常重要
XPath既然叫Path,就是一路径表达式的形式来指定元素,这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。由于XPath一开始是被用来搜寻XML文档的,所以接下来就以XML文档为例子来讲解XPath
XPath节点
在XPath中,XML文档是被作为节点树来对待的,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。树的根被称为文档节点或者根节点。以下面XML文档为例进行说明
<?xml version="1.0" encoding="ISO-8859-1" ?>
<classroom><student><id>1001</id><name lang = "en">marry</name><age>20</age><country>China</country></student>
</classroom>
❤️ 上面的XML文档中的节点例子包括:< classroom > (文档节点)、< id > 1001 </ id>(元素节点)、< lang=“en” >(属性节点)、marry(文本)
节点关系:父(Parent)、子(Children)、同胞(Sibling)、先辈(Ancestor)、后代(Descendant)
在上面的文档中:
student元素是id、name、age、以及country元素的父
id、name、age、以及country元素都是student元素的子
id、name、age以及country元素都是同胞节点,拥有相同的父节点
name元素的先辈是student元素和classroom元素,也就是此节点的父、父的父等
classroom的后代是student、id、name、age以及country元素,也就是此节点的子,子的子等
XPath语法
XPath使用路径表达式来选取XML文档中的节点或节点集。节点是沿着路径path或者步steps来选取的。接下来的重点是如何取节点,以下面XML文档进行分析
<?xml version="1.0" encoding="ISO-8859-1" ?>
<classroom><student><id>1001</id><name lang = "en">marry</name><age>20</age><country>China</country></student><student><id>1002</id><name lang = "en">jack</name><age>25</age><country>USA</country></student>
</classroom>
路径表达式
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | 选择任意位置的某个节点 |
. | 选取当前节点 |
. . | 选取当前节点的父节点 |
@ | 选择属性 |
❤️ 通过表格中的路径表达式,尝试对上面的文档进行节点选取,如下所示
节点选取示例
实现效果 | 路径表达式 |
---|---|
选取classroom元素的所有子节点 | classroom |
选取根元素classroom | /classroom |
选取属于classroom的子元素的所有student元素 | classroom/strudent |
选取所有student子元素,而不管他们在文档中的位置 | //student |
选择属于classroom元素的后代的所有student元素,而不管它们位于classroom之下的什么位置 | classroom//student |
选取名为lang的所有属性 | //@lang |
❤️ 上面选取的例子最后实现的效果都是选取了所有符合条件的节点,是否能选取某个特点的节点或者包括某一个指定的值的节点呢?这就需要用到谓语,谓语被嵌在方括号中
谓语示例
实现效果 | 路径表达式 |
---|---|
选取属于classroom子元素的第一个student元素 | /classroom/student[1] |
选取属于classroom子元素的最后一个student元素 | /classroom/student[last()] |
选取属于classroom元素的倒数第二个student元素 | /classroom/student[last()-1] |
选取最前面的两个属于classroom元素的子元素student元素 | /classroom/student[position() < 3] |
选取所有拥有名为lang的属性的name元素 | //name[@lang] |
选取所有name元素,且这些元素拥有值为eng的lang属性 | //name[@lang=‘en’] |
选取classroom元素的所有student元素,且其中的age元素的值须大于20 | /classroom/student[age>20] |
选取classroom元素中的student元素的所有name元素,且其中的age元素的值须大于20 | /classroom/student[age>20]/name |
❤️ XPath在进行节点选取的时候可以使用通配符“*”匹配未知的元素,同时使用操作符“|”一次选取多条路径,还是通过一个表格进行演示
通配符“*”与“|”操作符
选取classroom元素的所有子元素 | 路径表达式 |
---|---|
选取classroom元素的所有子元素 | /classroom/* |
选取文档中的所有元素 | //* |
选取所有带有属性的name元素 | //name[@* ] |
选取student元素的所有name和age元素 | //student/name |
选取属于classroom元素的student元素的所有name元素,以及文档中所有的age元素 | /classroom/student/name |
XPath轴
轴定义了所选节点与当前节点之间的树的关系。在Python爬虫开发中,提取网页中的信息会遇到这种情况:首先提取到一个节点的信息,然后想在在这个节点的基础上提取它的子节点或者父节点,这时候就会用到轴的概念。轴存在会使提取变得更加灵活和准确
在说轴的用法之前,需要了解位置路径表达式中的相对位置路径、绝对位置路径和步的概念。位置路径可以是绝对的,也可以是相对的。绝对路径起始于正斜杆(|),而相对路径不会这样。在两种情况中,位置路径均包括一个或多个步,每个步均被斜杠分割:/step/step/… (绝对位置路径),step/step/…(相对位置路径)
步(step)包括:轴(axis)、节点测试(node-test)、零个或者更多谓语(predicate),用到更深入地提炼所选的节点集。
步的语法:轴名称::节点测试[谓语]
XPath轴
轴名称 | 含义 |
---|---|
child | 选取当前节点的所有子元素 |
parent | 选取当前节点的父节点 |
ancestor | 选取当前节点的所有先辈(父、祖父等) |
ancest-or-self | 选取当前节点的所有先辈(父、祖父等)以及当前节点本身 |
descendent | 选取当前节点的所有后代元素(子、孙等) |
descendant-or-self | 选取当前节点的所有后代(子、孙等)以及当前节点本身 |
preceding | 选取文档中当前节点的开始标记之前的所有节点 |
following | 选取文档中当前节点的结束标记之后的所有节点 |
preceding-sibling | 选取当前节点之前的所有同级节点 |
following-sibling | 选取当前节点之后的所有同级节点 |
self | 选取当前节点 |
attribute | 选取当前节点的所有属性 |
namespace | 选取当前节点的所有命名空间节点 |
示例分析
<?xml version="1.0" encoding="ISO-8859-1" ?>
<classroom><student><id>1001</id><name lang = "en">marry</name><age>20</age><country>China</country></student><student><id>1002</id><name lang = "en">jack</name><age>25</age><country>USA</country></student><teacher><classid>1</classid><name lang = "en">tom</name><age>50</age><country>USA</country></teacher>
</classroom>
针对上面的文档进行示例演示
XPath轴示例分析
实现效果 | 路径表达式 |
---|---|
选取当前classroom节点中子元素的teacher节点 | /classroom/child::teacher |
选取所有id节点的父节点 | //id/parent:: * |
选取所有以classid为子节点的祖先节点 | //classid/ancestor:: * |
选取classroom节点下的所有后代节点 | /classroom/descendant:: * |
选取所有以student为父节点的id元素 | //student/descendant:: id |
选取所有classid元素的祖先节点及本身 | //classid/ancestor-or-self:: * |
选取/classroom/student本身及所有后代元素 | /classroom/student/descendant-or-self:: * |
选取/classroom/teacher之前的所有同级节点,结果就是选择了所有的student节点 | /classroom/teacher/preceding-sibling:: * |
选取/classroom中第二个student之后的所有同级节点,结果就是选择了teacher节点 | /classroom/teacher[2]/following-sibling:: * |
选取/classroom/teacher/节点所有之前的节点(除其祖先外),不仅仅是student节点,还有里面的子节点 | /classroom/teacher/preceding:: * |
选取/classroom中第二个student之后的所有节点,结果就是选择了teacher节点及其子节点 | /classroom/student[2]/following:: * |
选取student节点,单独使用没有什么意思。主要是跟其他轴一起使用,如ancestor-or-self,descendant-or-self | //student/self:: * |
选取/classroom/teacher/name节点的所有属性 | /classroom/teacher/name/attribute:: * |
XPath运算符
XPath表达式可返回节点集、字符串、逻辑值以及数字。
XPath运算符示例分析
运算符 | 描述 | 实例 | 含义 |
---|---|---|---|
正斜杆 | 计算两个节点集 | //student/name正斜杆//student/age | 选取student元素的所有name和age元素 |
+ | 加法 | /classroom/student[age=19+1] | 选取classroom元素的所有student元素,且其中的age元素的值须等于20 |
- | 减法 | /classroom/student[age=21-1] | 同上 |
* | 乘法 | /classroom/student[age=4*5] | 同上 |
div | 除法 | /classroom/student[age=40 div 2] 同上 | |
= | 等于 | /classroom/student[age=20] | 同上 |
!= | 不等于 | /classroom/student[age!=20] | 选取classroom元素的所有student元素,且其中age元素的值不等于20 |
< | 小于 | /classroom/student[age<20] | 选取classroom元素的所有student元素,且其中age元素的值小于20 |
<= | 小于等于 | /classroom/student[age<=20] | 选取classroom元素的所有student元素,且其中age元素的值小于等于20 |
> | 大于 | /classroom/student[age>20] | 选取classroom元素的所有student元素,且其中age元素的值大于20 |
>= | 大于等于 | /classroom/student[age>=20] | 选取classroom元素的所有student元素,且其中age元素的值大于等于20 |
or | 或 | /classroom/student[age<20 or age>25] | 选取classroom元素的所有student元素,且其中age元素的值小于20,或者大于25 |
and | 与 | /classroom/student[age>20 and age<25] | 选取classroom元素的所有student元素,且其中age元素的值大于20,且小于25 |
mod | 计算除法的余数 | 5 mod 2 | 1 |
Python_XPath相关推荐
- 【Python_Xpath学习笔记(一)】 Xpath选择器基础用法介绍
Xpath选择器基础用法介绍 前言 此篇文章中介绍Xpath的定义和基本使用方法,特此记录用来加深印象,较为基础. 正文 1.Xpath简介 Xpath:XML Path Language - XML ...
最新文章
- 介绍下Nginx 反向代理与负载均衡
- 各种边缘检测算法效果对比-差分运算法、Sobel、Scharr、Laplace(拉普拉斯)、Roberts、Canny
- 安装python sklearn经验总结
- 简单分析及总结BlockingQueue接口下七个常用类
- 电脑word在哪_新的电脑应该安装哪些软件?只需这9个足够你用一生!
- redis内存行数据库细节
- Titanium系列--对Window和View的一点理解
- C语言中结构化数据(变量,指针,数组,字符串,结构体和联合)的内存表示
- 密码学--CTF Crypto
- PE恢复linux主引导记录,Linux中系统排错及引导恢复
- MySQL统计每月数量并计算同比增长率
- python dataframe新增一列
- 写代码写文章勿有功利心
- Bootstrap4模态框垂直居中
- 如何让代码在word中显示行号?
- 【ES6】阮一峰ES6学习之Promise(一)
- ESP1020E汉王签字屏API版 支持红色笔迹
- C#报错:未将对象设置到对象实例 Object reference not set to an instance of an object
- 会计专硕论文选题案例怎么找?
- Proteus元件库对照表 中英文在线查询工具
热门文章
- python安装opencv2.4.9_Python学习之一:Python2.7与opencv2.4安装配置
- shiro springboot 整合
- impdb导入oracle,impdp导入.dmp到oracle
- Batch Normalization论文笔记
- linux安装mysql允许外部访问权限_Linux yum 安装mysql以及进行授权允许远程登录
- mutilprocess模块的用法
- javasrcipt的作用域和闭包(二)续篇之:函数内部提升机制与Variable Object
- BZOJ 2959 - 长跑
- oracle sql 基础(六):数据控制语言(用户及权限管理)
- BZOJ 1020 安全的航线flight