Xpath
Xpath是一门在XML文档中查找信息的语言,被用于在XML文档中通过元素和属性进行导航,也可以用在HTML文档中工作。Python爬虫开发中,经常使用Xpath查找提取网页中的信息,因此Xpath非常重要。
1、Xpath节点
在Xpath中,XML文档被作为节点树来对待的,有7种类型节点:
- 元素
- 属性
- 文本
- 命名空间
- 处理指令
- 注释
- 文档(根)节点
来看一个例子:
<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>
<classroom>
是文档节点
<id>1001</id>
是元素节点
lang="en"
是属性节点
marry
是文本节点
节点关系包括父(parent)、子(children)、同胞(sibling)、 先辈(ancestor)、后代(descendent)。
2、Xpath语法
路径表达式
Xpath使用路径表达式来选取XML文档中的节点或节点集。节点是沿着路径path或步steps来选取的。
常用的路径表达式:
表达式 | 描述 |
---|---|
nodename | 选取节点的所有子节点 |
/ | 从根节点选取 |
// | 选取任意位置的某个节点 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
看一个例子:
<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>
实现效果 | 路径表达式 |
---|---|
选取classroom的所有子节点 | classroom |
选取根元素classroom | /classroom |
选取属于classroom的子元素的所有student元素 | classroom/student |
选取所有sudent子元素,而不管它们在文档中的位置 | //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子元素的最前面的两个studaent元素 | /classroom/student[position()❤️] |
选取所有拥有lang属性的name元素 | //name[@lang] |
选取所有拥有lang属性并且值为“en”的name元素 | //name[@lang='en'] |
选取classroom元素的所有studnet元素,并且其age元素的值大于20 | /classroom/student[age>20] |
选取classroom元素中的student元素的所有name元素,并且其age元素的值大于20 | /classroom/student[age>20]/name |
通配符
- 使用通配符“*”匹配未知的元素
- 使用通配符“|”一次选取多条路径
实现效果 | 路径表达式 |
---|---|
选取classroom元素的所有子元素 | /classroom/* |
选取文档中的所有元素 | //* |
选取所有带有属性的name元素 | //name[@*] |
选取student元素的所有name元素和age元素 | //student/name | //student/age |
选取属于classroom元素的student元素的所有name元素,以及文档中所有age元素 | /classroom/student/name | //age |