ElementTree库附带了一个简单的类似XPath的路径语言ElementPath
主要区别在于,可以在ElementPath表达式中使用{namespace}标记符号
但是,诸如值比较和函数之类的高级功能不可用

只要树没有被修改,这个路径表达式就表示一个给定元素的标识符,以后可以用它在同一棵树中找到它
与XPath相比,ElementPath表达式具有自包含的优势,即使对于使用名称空间的文档也是如此

除了完整的XPath实现之外,lxml.etree支持ElementPath语言的方式与ElementTree相同
甚至使用(几乎)相同的实现。API在这里提供了四种方法,可以在Elements和ElementTrees上找到它们
  iterfind(): 遍历与路径表达式匹配的所有元素
  findall(): 返回匹配元素的列表
  find(): 只有效地返回第一个匹配项
  findtext(): 返回第一个匹配项的.text内容

# coding:utf-8
from lxml import etree #查找当前节点的子节点
root = etree.XML("<root><a x='123'>aText<b/><c/><b/></a></root>")
print(root.find("b")) #输出:None,因为root的子节点是a
print(root.find("a").tag) #输出:a #查找树中的任意节点
print(root.find(".//b").tag) #输出:b
print([ b.tag for b in root.iterfind(".//b")]) #输出:['b', 'b'] #查找带指定属性的节点
print(root.findall(".//a[@x]")[0].tag) #输出:a
print(root.findall(".//a[@y]")) #输出:[] #在lxml 3.4中,有一个新的功能为元素生成一个结构化的ElementPath表达式
tree = etree.ElementTree(root)
a = root[0]
print(tree.getelementpath(a[0])) #输出:a/b[1]
print(tree.getelementpath(a[1])) #输出:a/c
print(tree.getelementpath(a[2])) #输出:a/b[2]
print(tree.find(tree.getelementpath(a[2])) == a[2]) #输出:True #.iter()方法是一种特殊情况,它只根据名称在树中查找特定标记,而不是基于路径
#这意味着以下命令在成功案例中是等价的
print(root.find(".//b").tag) #输出:b
print(next(root.iterfind(".//b")).tag) #输出:b
print(next(root.iter("b")).tag) #输出:b #注意,如果没有找到匹配项,.find()方法只返回None,而其他两个示例将引发StopIteration异常

ElementPath的更多相关文章

  1. 记使用aliyun-log-logback-appender 报错no applicable action for [encoder], current ElementPath is [[configuration][appender][encoder]]

    依赖: <dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>aliy ...

  2. no applicable action for [springProfile], current ElementPath is [[configuration][springProfile]]

    今天down了一个开源项目,启动后一直存在如下错误信息: ERROR in ch.qos.logback.core.joran.spi.Interpreter@26:42 - no applicabl ...

  3. 【异常】ERROR in ch.qos.logback.core.joran.spi.Interpreter@159:22 - no applicable action for [charset], current ElementPath is [[configuration][appender][encoder][charset]]

    一.异常信息 Exception in thread "restartedMain" java.lang.reflect.InvocationTargetException at ...

  4. Logback报错 no applicable action for [Encoding], current ElementPath is [[configuration][appender][Encoding]]

    老版本是0.9,移到springboot项目,解决办法,删除xml配置文件节点<Encoding>UTF-8</Encoding>

  5. Python(五)模块

    本章内容: 模块介绍 time & datetime random os sys json & picle hashlib XML requests ConfigParser logg ...

  6. python模块(shelve,xml,configparser,hashlib,logging)

    1.1shelve模块 shelve 模块比pickle模块简单,只有一个open函数,返回类似字典对象,可读可写:key必须为字符串, 而值可以是python所支持的数据类型. shelve模块主要 ...

  7. java分享第十七天-01(封装操作xml类)

    做自动化测试的人,都应该对XPATH很熟悉了,但是在用JAVA解析XML时,我们通常是一层层的遍历进去,这样的代码的局限性很大,也不方便,于是我们结合一下XPATH,来解决这个问题.所需要的JAR包: ...

  8. java 解析并生成 XML

    在 java 中使用 Dom4j 解析 XML 对 XML 文件的解析,通常使用的是 Dom4j 和 jdom 作为XML解析工具. 在此只介绍下 Dom4j 对 XML 文件的解析使用方法. 1. ...

  9. 【开源】SoDiaoEditor 可能是目前最好用的开源电子病历编辑器(B/S架构)

    此刻我的内心是忐忑的,这个标题给了我很大的压力,虽然很久以前我就在github上搜索一圈了,也没发现有其他更好的开源电子病历编辑器,如各位亲发现有更好的,烦请知会我一声. 该编辑器其实已经憋了很久了, ...

随机推荐

  1. django----cookie与session 和 中间件

    目录 cookie与session简介及操作 cookie django中操作cookie cookie超时时间 删除cookie session session操作 设置 key value发生了什 ...

  2. django基础之day08,分页器从无到有,动态思路解析全过程

    *********分页器从无到有的全过程,动态思路解析如下:******** 1.通过book_queryset = models.Book.objects.all()[start_num:end_n ...

  3. SpringMVC深入浅出(一)

    1.Springmvc是什么 是一个表现层框架,用于接受请求及参数,响应请求回显数据. 2.SpringMVC处理流程 SpringMVC流程 1.  用户发送请求至前端控制器DispatcherSe ...

  4. c++之程序流程控制

    三种程序运行结构:顺序结构.选择结构.循环结构. 顺序结构:程序按顺序执行,不发生跳转. 选择结构:依据条件执行不同的语句. 循环结构:判断条件是否满足,循环多次执行某段代码. 一.选择结构 //单行 ...

  5. 955 不加班的公司名单:955.WLB

    前两天说到,韩老师的 Github 总 star 数量超过了 20000!全球排名第 232! 他,TypeScript GitHub Star 上海第一,全国第四!GitHub 总标星超两万! 其实 ...

  6. C#基础——break ,continue, return用法

  7. linux for games; steamos; fedora game distribution

    最近对linux 游戏发行版系统产生了兴趣,下面简要记录一些链接: https://itsfoss.com/linux-gaming-distributions/ (9 款游戏系统) https:// ...

  8. 2019年Java面试题基础系列228道(3)

    51.类 ExampleA 继承 Exception,类 ExampleB 继承ExampleA. 有如下代码片断: try { throw new ExampleB("b")}c ...

  9. 富士通 DX90 S2存储分配映射盘

    屁话不多说,直接开操: 1.连接存储 用pc连接到存储管理口,如192.168.1.101 登录管理账号:默认root/root 创建Volume, 点击create开始创建新的volume 按需填写 ...

  10. 零基础想学习C语言,没资源、没人带、不知道从何开始?

    初学编程的小伙伴经常会遇到的问题,1.没资源 2.没人带 3.不知道从何开始 ? 小编也是从新手期过来的,所以很能理解萌新的难处,现在整理一些以前自己学习买来的一些资料送给大家,希望对广大初学小伙伴有 ...