Xpath语法学习

XPath是一门在XML文档中查找信息的语言,被用于在XML文档中通过元素和属性进行导航。XPath虽然是被设计用来搜寻XML文档,不过它也能很好地在HTML文档中工作,并且大部分浏览器也支持通过XPath来查询节点。在Python爬虫开发中,经常使用XPath查找提取网页中的信息,因此XPath非常重要,支持Xpath语法的模板有lxml、scrapy。

文档示例:

<? 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>

1、路径表达式

表达式 用途
nodename 选取此节点的所有子节点
/ 从根节点选取
// 选择任意位置的某个节点
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性

2、节点选取示例

实现效果 路径表达式
选取classroom元素的所有子节点 classroom
选取根元素classroom /classroom
选取属于classroom的子元素的所有student元素 classroom/student
选取所有student子元素,而不管它们在文档中的位置 //student
选择属于classroom元素的后代的所有student元素,而不管它们位于classroom之下的什么位置 classroom//student
选取名为lang的所有属性 //@lang

3、谓语示例

实现效果 路径表达式
选取属于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元素,且这些元素拥有值为en的lang属性 //name[@lang='en']
选取classroom元素的所有student元素,且其中的age元素的值须大于20 /classroom/student[age>20]
选取classroom元素中的student元素的所有name元素,且其中的age元素的值须大于20 /classroom/student[age>20]/name

4、通配符* 与 | 操作符

实现效果 路径表达式
选取classroom元素的所有子元素 /classroom/*
选取文档中的所有元素 //*
选取所有带属性的name元素 //name[@*]
选取student元素的所有name和age元素 //student/name | //student/age
选取属于classroom元素的student元素的所有name元素,以及文档中所有的age元素 /classroom/student/name | //age

5、Xpath轴

轴名称 含义
child 选取当前节点的所有元素
parent 选取当前节点的父节点
ancestor 选取当前节点的所有先辈(父、祖父等)
ansestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身
descendant 选取当前节点的所有后代元素(子、孙等)
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>

6、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/student[2]/following-sibling::*
选取/classroom/teacher/节点所有之前的节点(除其祖先外),不仅仅是student节点,还有里面的子节点 /classroom/teacher/preceding::*
选取classroom中第二个student之后的所有节点,结果就是选择了teacher节点及其子节点 /classroom/student[2]/following::*
选取student节点,单独使用没有什么意思。主要是跟其它轴一起用,如ancestor-of-self,descendant-or-self //student/self::*
选取/classroom/teacher/name节点下的所有属性 /classroom/teacher/name/attribute::*

7、运算符

运算符 描述 实例 含义
| 计算两个节点集 //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] 选取student元素的所有name和age元素,且其中的age元素的值不等于20
< 小于 /classroom/student[age<20] 选取student元素的所有name和age元素,且其中的age元素的值小于20
<= 小于等于 /classroom/student[age<=20] 选取student元素的所有name和age元素,且其中的age元素的值小于等于20
> 大于 /classroom/student[age>20] 选取student元素的所有name和age元素,且其中的age元素的值大于20
>= 大于等于 /classroom/student[age>=20] 选取student元素的所有name和age元素,且其中的age元素的值大于等于20
or /classroom/student[age<20 or age>25] 选取student元素的所有name和age元素,且其中的age元素的值须小于20,或者大于25
and /classroom/student[age>20 and age<25] 选取student元素的所有name和age元素,且其中的age元素的值须大于20,或者小于25
mod 计算除法的余数 5 mod 2 1

posted on 2018-03-19 14:14  K‘e0llm  阅读(311)  评论(0编辑  收藏  举报

导航