在Python中,使用 XPath 是一种非常流行的技术,用于解析和查询 XML 或 HTML 文档。本文小编与大家分享 Python 使用 XPath 的相关知识。
一、XPath 简介
(一)什么是 XPath
XPath (XML Path Language,XML 路径语言)是用来在 XML 或 HTML 文档里精准定位元素的查询语言,就像给文档里的每个内容标上地址,让程序能快速找到想要的信息。它属于 W3C 国际标准,广泛应用于数据提取、网页爬虫和自动化测试等领域。XPath 通常念作"X Path"(字母 X 加单词 Path)
(二)XPath 术语
1、节点
节点(Node)是 XPath 的术语。
在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。
2、基本值(或称原子值,Atomic value)
基本值是无父或无子的节点。例如:文本内容元素。
3、项目(Item)
项目是基本值或节点。
(三)节点间的关系
节点间的关系包括:父、子、兄弟、先辈(父、爷等,直至鼻祖)、后代(子、孙等,直至耳孙)几种。
(四)XPath 语法
1、选取节点
XPath 使用路径表达式来选取 XML 或 HTML 文档中的节点或者节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。这些路径表达式和电脑文件系统中的路径表达式(使用斜杠 / 分层)非常相似。
XPath 常用路径表达式如下所示:
/ :绝对路径,从根节点开始选取。例如: /root 表示选取 root 根节点, /root/book 表示选取 root 根节点的所有 book 子元素节点;
// :相对路径,从任意位置开始选取。例如: //book 表示选取文档中的所有 book 元素节点;
. :选取当前节点;
.. :选取当前节点的父节点;
@ :选取属性。例如://book@name 表示选取文档中所有带 name 属性的 book 元素节点。
2、谓语(Predicates)
谓语用来查找某个特定的节点或者包含某个指定值的节点。谓语被嵌在方括号中成为 XPath 路径表达式的组成,通常针对位置、属性和指定值等进行筛选过滤。常见带谓语的 XPath 路径表达式如下所示:
/bookstore/book[1]:选取属于 bookstore 子元素的第一个 book 元素;
/bookstore/book[last()]:选取属于 bookstore 子元素的最后一个 book 元素;
/bookstore/book[last()-1]:选取属于 bookstore 子元素的倒数第二个 book 元素;
/bookstore/book[position()<3]:选取最前面的两个属于 bookstore 元素的子元素的 book 元素;
//title[@lang]:选取所有拥有名为 lang 的属性的 title 元素;
//title[@lang='eng']:选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性;
/bookstore/book[price>40.00]:选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 40.00;
/bookstore/book[price>40.00]//title:选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 40.00。
3、选取未知节点
可以使用 XPath 的通配符来选取未知的文档节点。这些通配符含义如下所示:
* :匹配任何元素节点。例如:/bookstore/* 选取 bookstore 元素的所有子元素;
@* :匹配任何属性节点。例如://* 选取文档中的所有元素;
node() :匹配任何类型的节点。例如://title[@*] 选取所有带有属性的 title 元素。
4、选取多个路径
通过在路径表达式中使用"|"运算符,可以选取若干个路径。常见选取多个路径的 XPath 路径表达式如下所示:
//book/title | //book/price:选取 book 元素的所有 title 和 price 元素;
//title | //price:选取文档中的所有 title 和 price 元素;
/bookstore/book/title | //price:选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。
受文章篇幅所限,下文将继续介绍 Python 使用 XPath 的相关知识。