Xpath与lxml_2XPath语法

XPath使用路径表达式选择节点。

以下XML文档作为示例:

xml='''<?xml version="1.0" encoding="utf8"?>
<bookstore>
  <book>
    <title lang="eng">Harry Potter</title>
    <price>29.99</price>
  </book>
  <book>
    <title lang="eng">Learning XML</title>
    <price>39.95</price>
  </book>
</bookstore>'''


一、选择节点

以下是基本路径的表达式,XPath的路径表达式都是基于某个节点之上的。

表达式描述
nodename选取匹配节点nodename的所有子元素节点
/若以/开头,表示以根节点作为选取起点
//在已匹配节点后代中选取节点,不考虑目标节点的位置
.选取当前节点
..选取当前节点的父元素节点
@选取属性

举例:

from lxml import xpath

# 得到根节点
root=etree.fromstring(xml)

# 选取所有book子元素
root.xpath('book')

# 选取根节点bookstore
root.xpath('/bookstore')

# 选取所有book子元素的title子元素
root.xpath('book/title')

# 以根节点为始祖,选取其后代中所有title元素,不管其在文档中的位置
root.xpath('//title')

# 以book子元素作为始祖,选取后代中的所有price元素
root.xpath('book//price')

# 以根节点为始祖,选取其后代中lang的所有属性
root.xpath('//@lang')


二、谓语predicate

用以查找某个特定的节点或符合某种条件的节点,谓语表达式位于方括号中。

举例:

# 选取属于bookstore子元素的第一个book元素
root.xpath('/bookstore/book[1]')

# 选取属于bookstore子元素的最后一个book元素
root.xpath('/bookstore/book[last()]')

# 选取属于bookstore子元素的倒数第二个book元素
root.xpath('bookstore/book[last()-1]')

# 选取属于bookstore子元素的前两个book元素
root.xpath('/bookstore/book[position()<3]')

# 以根节点为始祖,选取其后代所有含有lang属性的title元素
root.xpath('//title[@lang]')

# 以根节点为始祖,选取其后代所有的title元素,且这些元素拥有值为eng的lang属性
root.xpath('//title[@lang="eng"]')

# 选取bookstore中所有book子元素,且book的price子元素的值大于35
root.xpath('/bookstore/book[price>35.00]')

# 选取bookstore中所有book子元素的title子元素,且book的price的值大于35
root.xpath('/bookstore/book[price>35.00]/title')


三、通配符

通配符描述
*匹配任何元素节点
@*匹配任何属性节点
node()匹配任何类型的节点

举例:

# 选取 bookstore 所有子元素
>>> root.xpath('/bookstore/*')  

# 选取根节点的所有后代元素
>>> root.xpath('//*')  

# 选取根节点的所有具有属性节点的title元素
>>> root.xpath('//title[@*]')  

# 选取当前节点下所有节点。'\n    '是文本节点。
>>> root.xpath('node()')  

# 选取根节点所有后代节点,包括元素、属性、文本。
>>> root.xpath('//node()')  

四、或条件选取

使用|运算符,选取符合或条件的若干路径。

举例:

# 选取所有book元素的title元素和price元素
>>> root.xpath('//book/title | //book/price')

# 选择所有title和price元素
>>> root.xpath('//title|//price')

# 选择book子元素title或者全部的price元素
>>> root.xpath('/bookstore/book/title | //price')


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值