XPath的使用
常用的路径表达式
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑他们的位置 |
. | 选取当前节点 |
… | 选取当前节点的父节点 |
@属性名 | 选取属性 |
| | 选取若干路径 |
当前节点的相关节点
-
child:选取当前节点的所有子元素
child子节点定位://div[@id="testid"]/child::ul/li/text()
当前节点的所有子元素//div[@id="testid"]/child::*
定位某节点下为ol的子节点下的所有节点//div[@id="testid"]/child::ol/child::*/text()
-
attribute选取当前节点的所有属性
attribute定位id属性值//div/attribute::id
定位当前节点的所有属性://div[@id="testid"]/attribute::*')
-
ancestor:父辈元素
ancestor-or-self:父辈元素及当前元素
//div[@id="testid"]/ancestor::div/@price')
定位父辈div元素的price属性//div[@id="testid"]/ancestor::div
所有父辈div元素//div[@id="testid"]/ancestor-or-self::div
所有父辈元素以及当前节点div元素 -
descendant:后代
descendant:后代及当前节点本身
使用和ancestor一样
-
following:选取文档中当前节点的结束标签之后的所有节点
//div[@id="testid"]/following::div[not(@id)]/.//li[1]/text()
定位testid之后不包含id属性的div标签下所有的li中的第一个li的text属性 -
namespace:选取当前节点的所有命名空间节点
//div[@id="testid"]/namespace::*
选取命名空间节点 -
parent:选取当前节点的父节点
//li[@data="one"]/parent::ol/li[last()]/text()
选取data值为one的父节点的子节点中最后一个节点的值 -
preceding-sibling:选取当前节点之前的所有同级节点
//div[@id="testid"]/preceding-sibling::div/ul/li[2]/text()
-
self:选取当前节点
//div[@id]/self::div[@data-h]/attribute::*
-
position定位
//*[@id="testid"]/ol/li[position()=2]/text()
-
条件
u'//h2[text()="这里是个小标题"]/text()'
-
当前节点的下几个节点
<div> <a id="1" href="www.baidu.com">我是第1个a标签</a> <p>我是p标签</p> <a id="2" href="www.baidu.com">我是第2个a标签</a> <a id="3" href="www.baidu.com">我是第3个a标签</a> <a id="4" href="www.baidu.com">我是第4个a标签</a> <p>我是p标签</p> <a id="5" href="www.baidu.com">我是第5个a标签</a> </div>
获取第三个a标签的下一个a标签:"//a[@id=‘3’]/following-sibling::a[1]"
获取第三个a标签后面的第N个标签:"//a[@id=‘3’]/following-sibling:????[N]"
获取第三个a标签的上一个a标签:"//a[@id=‘3’]/preceding-sibling::a[1]"
获取第三个a标签的前面的第N个标签:"//a[@id=‘3’]/preceding-sibling:????[N]"
通配符
选取未知的xml元素
通配符 | 描述 | 举例 | 结果 |
---|---|---|---|
* | 匹配任何元素节点 | xpath(‘div/*’) | 获取div下的所有子节点 |
@* | 匹配任何属性节点 | xpath(‘div[@*]’) | 获取所有带属性的div节点 |
node() | 匹配任何类型的节点 |
#多个
xpath('//div | //table')
# 获取所有的div与table节点
谓语
表达式 | 结果 |
---|---|
xpath(’/body/div[1]’) | 选取body下的第一个div节点 |
xpath(’/body/div[last()]’) | 选取body下的最后一个div节点 |
xpath(’/body/div[last()-1]’) | 选取倒数第二个 |
xpath(’/body/div[posion()❤️]’) | 前两个 |
xpath(’/body/div[@class]’) | 带有class属性的div节点 |
xpath(’/body/div[@class=“main”]’) | 选取class属性值为main的div节点 |
xpath(’/body/div[price]>35.00’) | 选取body下price元素大于35的节点 |
运算符
+ - * div = != < <= > >= or and mod
获取属性值
//div[@id="indexCarousel"]//div[@class="item"]//img/@src
//div[@class="book-mid-info"]/h4/a/@href
函数
count:统计
'count(//li[@data])'
concat:字符串连接
concat(//li[@data="one"]/text(),//li[@data="three"]/text())
string:解析当前节点下的字符
string(//li)
local-name:解析节点名称
'local-name(//*[@id="testid"])'
contains(string1,string2):如果 string1 包含 string2,则返回 true,否则返回 false
//h3[contains(text(),"H3")]/a/text()
not:布尔值(否)
count(//li[not(@data)]):不包含data属性的li标签统计
string-length:返回指定字符串的长度
//*[string-length(local-name())<2]/text()
string-length函数+local-name函数定位节点名长度小于2的元素
starts-with:以。。
//li[starts-with(@code,"8")]/text()
定位属性值以8开头的li元素
div:对某两个节点的属性值做除法
//div[@id="testid"]/ul/li[3]/@code div //div[@id="testid"]/ul/li[1]/@code
还原element对象
etree.tostring(s) 还原这个对象为html字符串
上一篇: Python内置数据结构之Dict
下一篇: Xpath 文档的使用