XPATH简介
- 以斜杠开始的称为绝对路径,表示从根开始。
- 不以斜杠开始的称为相对路径,一般都是依照当前节点来计算。当前节点在上下文环境中,当前节点很可能已经补是根节点了。
- 一般为了方便,往往xml如果层次很深,都会使用//来查找节点。
XPATH语法总结
路径表达式 | 含义 |
---|---|
title | 选取当前节点下所有title子节点 |
/book | 从根节点找子节点是book的,找不到 |
book/title | 当前节点下所有子节点book下的title节点 |
//title | 从根节点向下找任意层中title的结点 |
book//title | 当前节点下所有book子节点下任意层次的title节点 |
//@id | 任意层次下含有id的属性,取回的是属性 |
//book[@id] | 任意层次下含有id属性的book节点 |
//*[@id] | 任意层下含有id属性的节点 |
//book[@id=“bk102”] | 任意层次下book节点,且含有id属性为bk102的节点。 |
/bookstore/book[1] | 根节点bookstore下第一个book节点,从1开始 |
/bookstore/book[1]/@id | 根节点bookstore下的第一个book节点的id属性 |
/bookstore/book[last()-1] | 根节点bookstore下倒数第二个book节点, |
函数last() | 返回最后一个元素索引 |
/bookstore/* | 匹配根节点bookstore的所有子节点,不递归 |
//* | 匹配所有子孙节点 |
//[@] | 匹配所有有属性的节点 |
//book/title | //price |
//book[position()=2] | 匹配book节点,取第二个 |
//book[position()<last()-1] | 匹配book节点,取位置小于倒数第二个 |
//book[price>40] | 匹配book节点,取节点值大于40的book节点 |
//book[2]/node() | 匹配位置为2的book节点下的所有类型的节点 |
//book[1]/text() | 匹配第一个book节点下的所有文本子节点 |
//book[1]/text() | 匹配第一个book节点下的所有文本节点 |
//*[local-name()=“book”] | 匹配所有节点且不带限定名的节点名称为book的所有节点。 |
local-name | 函数取不带限定名的名称。相当于指定标签元素为…的节点 |
下面这三种表达式等价 | |
//book[price<6]/price | |
//book/price[text()<6] | |
//book/child::node()[local-name()=“price” and text()<6] | 获取book节点下的price节点,且price中内容小于6的节点 |
//book//*[self::title or self::price] | |
等价于//book//title | //book/price |
也等价于//book//*[local-name()=“title” or local-name()=“price”] | 所有book节点下子孙节点,且这些节点是title或者price。 |
//*[@class] | 所有有class属性的节点 |
//*[@class=“bookinfo even”] | 所有属性为“bookinfo even”的节点 |
//*[contains(@class,‘even’) | 获取所有属性class中包含even字符串的节点 |
//*[contains(local-name(),‘book’) | 标签名包含book的节点 |
函数总结
函数 | 含义 |
---|---|
local-name() | 获取不带限定名的名称。相当于指定标签元素 |
text() | 获取标签之间的文本内容 |
node() | 所有节点。 |
contains(@class,str) | 包含 |
starts-with(local-name(),“book”) | 以book开头 |
last() | 最后一个元素索引 |
position() | 元素索引 |
示例:
//div[@id="newscontent"]/div[1]/ul/li/span[1]/a
//div[@id="newscontent"]/div[1]/ul/li/span[1]/a/@href
//*[contains(@class,'s3')]
获取所有属性class中包含s3字符串的节点
//@href
//*[local-name()="p"]
等同于
//*[local-name()="p"]/text()
Ps:虽然python解析xml的库很多,但是,由于lxml在底层是用C语言实现的,所以lxml在速度上有明显优势。除了速度上的优势,lxml在使用方面,易用性也非常好。这里将以下面的xml数据为例,介绍lxml的简单使用。