Xpath语法学习

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

文档示例:node

<? 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 选取此节点的全部子节点
/ 从根节点选取
// 选择任意位置的某个节点
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性

二、节点选取示例scrapy

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

三、谓语示例spa

实现效果 路径表达式
选取属于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

四、通配符* 与 | 操做符ssr

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

五、Xpath轴设计

轴名称 含义
child 选取当前节点的全部元素
parent 选取当前节点的父节点
ancestor 选取当前节点的全部先辈(父、祖父等)
ansestor-or-self 选取当前节点的全部先辈(父、祖父等)以及当前节点自己
descendant 选取当前节点的全部后代元素(子、孙等)
descendant-or-self 选取当前节点的全部后代元素(子、孙等)以及当前节点自己
preceding 选取文档中当前节点的开始标记以前的全部节点
following 选取文档中当前节点的结束标记以后的全部节点
preceding-sibling 选取当前节点以前的全部同级节点
following-sibling 选取当前节点以后的全部同级节点
self 选取当前节点
attribute 选取当前节点的全部属性
namespace 选取当前节点的全部命令空间节点

文档示例: 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> 
    <teacher> 
        <classid>1</classid> 
        <name lang="en">tom</name> 
        <age>50</age> 
        <country>USA</country> 
    </teacher> 
</classroom>

六、Xpath轴示例分析htm

实现效果 路径表达式
选取当前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::*

七、运算符blog

运算符 描述 实例 含义
| 计算两个节点集 //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
相关文章
相关标签/搜索