Python3 xml.etree.ElementTree支持的XPath语法详解


Posted in Python onMarch 06, 2020

xml.etree.ElementTree可以通过支持的有限的XPath表达式来定位元素。

语法

ElementTree支持的语法如下:

语法 说明
tag 查找所有具有指定名称tag的子元素。例如:country表示所有名为country的元素,country/rank表示所有名为country的元素下名为rank的元素。
* 查找所有元素。如:*/rank表示所有名为rank的孙子元素。
. 选择当前元素。在xpath表达式开头使用,表示相对路径。
// 选择当前元素下所有级别的所有子元素。xpath不能以“//”开头。
.. 选择父元素。如果视图达到起始元素的祖先,则返回None(或空列表)。起始元素为调用find(或findall)的元素。
[@attrib] 选择具有指定属性attrib的所有子元素。
[@attrib='value'] 选择指定属性attrib具有指定值value的元素,该值不能包含引号。
[tag] 选择所有具有名为tag的子元素的元素。
[.='text'] Python3.7+,选择元素(或其子元素)完整文本内容为指定的值text的元素。
[tag='text'] 选择元素(或其子元素)名为tag,完整文本内容为指定的值text的元素。
[position] 选择位于给定位置的所有元素,position可以是以1为起始的整数、表达式last()或相对于最后一个位置的位置(如:last()-1)

方括号表达式前面必须有标签名、星号或者其他方括号表达式。position前必须有一个标签名。

简单示例

#!/usr/bin/python
# -*- coding:utf-8 -*-
import os
import xml.etree.cElementTree as ET
xml_string="""<?xml version="1.0"?>
<data>
  <country name="Liechtenstein">
    <rank updated="yes">2</rank>
    <year>2008</year>
    <gdppc>141100</gdppc>
    <neighbor name="Austria" direction="E"/>
    <neighbor name="Switzerland" direction="W"/>
  </country>
  <country name="Singapore">
    <rank updated="yes">5</rank>
    <year>2011</year>
    <gdppc>59900</gdppc>
    <neighbor name="Malaysia" direction="N"/>
  </country>
  <country name="Panama">
    <rank updated="yes">69</rank>
    <year>2011</year>
    <gdppc>2011</gdppc>
    <neighbor name="Costa Rica" direction="W"/>
    <neighbor name="Colombia" direction="E"/>
  </country>
	<country name="Washington">
    <rank updated="yes">55</rank>
    <gdppc>13600</gdppc>
  </country>
</data>
"""
root=ET.fromstring(xml_string)
#查找data下所有名为country的元素
for country in root.findall("country"):
	print("name:"+country.get("name"))
	#查找country下所有名为year的元素
	year=country.find("./year")
	if year:
		print("year:"+year.text)
#查找名为neighbor的孙子元素
for neighbor in root.findall("*/neighbor"):
	print("neighbor:"+neighbor.get("name"))
#查找country下的所有子元素
for ele in root.findall("country//"):
	print(ele.tag)
#查找当前元素的父元素,结果为空
print(root.findall(".."))
#查找与名为rank的孙子元素同级的名为gdppc的元素
for gdppc in root.findall("*/rank/../gdppc"):
	print("gdppc:"+gdppc.text)
#查找data下所有具有name属性的子元素
for country in root.findall("*[@name]"):
	print(country.get("name"))
#查找neighbor下所有具有name属性的子元素
for neighbor in root.findall("country/*[@name]"):
	print(neighbor.get("name"))
#查找country下name属性值为Malaysia的子元素
print("direction:"+root.find("country/*[@name='Malaysia']").get("direction"))
#查找root下所有包含名为year的子元素的元素
for country in root.findall("*[year]"):
	print("name:"+country.get("name"))
#查找元素(或其子元素)文本内容为2011的元素(Python3.7+)
#print(len(root.findall("*[.='2011']")))
#查找元素(或其子元素)名为gdppc,文本内容为2011的元素
for ele in root.findall("*[gdppc='2011']"):
	print(ele.get("name"))
#查找第二个country元素
print(root.find("country[2]").get("name"))

补充知识:python lxml etree xpath定位

etree全称:ElementTree 元素树

用法:

import requests
from lxml import etree
response = requests.get('html')
res = etree.HTML(response.text)   #利用 etree.HTML 初始化网页内容
resp = res.xpath('//span[@class="green"]/text()')

以上这篇Python3 xml.etree.ElementTree支持的XPath语法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python将阿拉伯数字转换为罗马数字的方法
Jul 10 Python
Python通过90行代码搭建一个音乐搜索工具
Jul 29 Python
一些常用的Python爬虫技巧汇总
Sep 28 Python
matplotlib绘制符合论文要求的图片实例(必看篇)
Jun 02 Python
Python切片索引用法示例
May 15 Python
Python利用公共键如何对字典列表进行排序详解
May 19 Python
Django实现简单网页弹出警告代码
Nov 15 Python
Python使用GitPython操作Git版本库的方法
Feb 29 Python
python画环形图的方法
Mar 25 Python
python批量检查两个对应的txt文件的行数是否一致的实例代码
Oct 31 Python
pdf论文中python画的图Type 3 fonts字体不兼容的解决方案
Apr 24 Python
使用Python脚本对GiteePages进行一键部署的使用说明
May 27 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
Mar 06 #Python
Python yield的用法实例分析
Mar 06 #Python
用Python生成HTML表格的方法示例
Mar 06 #Python
使用Python第三方库pygame写个贪吃蛇小游戏
Mar 06 #Python
Python修改列表值问题解决方案
Mar 06 #Python
浅谈matplotlib.pyplot与axes的关系
Mar 06 #Python
python-xpath获取html文档的部分内容
Mar 06 #Python
You might like
php xml留言板 xml存储数据的简单例子
2009/08/24 PHP
PHP新手用的Insert和Update语句构造类
2012/03/31 PHP
PHP小技巧之JS和CSS优化工具Minify的使用方法
2014/05/19 PHP
php去除二维数组的重复项方法
2015/11/03 PHP
PHP连接MSSQL方法汇总
2016/02/05 PHP
PHP数字前补0的自带函数sprintf 和number_format的用法(详解)
2017/02/06 PHP
php检测mysql表是否存在的方法小结
2017/07/20 PHP
Laravel定时任务的每秒执行代码
2019/10/22 PHP
使用Jquery打造最佳用户体验的登录页面的实现代码
2011/07/08 Javascript
JQuery中使用on方法绑定hover事件实例
2014/12/09 Javascript
JS时间特效最常用的三款
2015/08/19 Javascript
JavaScript学习笔记之数组的增、删、改、查
2016/03/23 Javascript
Javascript实现代码折叠功能
2016/08/25 Javascript
ReactNative-JS 调用原生方法实例代码
2016/10/08 Javascript
Laravel整合Bootstrap 4的完整方案(推荐)
2018/01/25 Javascript
vue-star评星组件开发实例
2018/03/01 Javascript
Angular中使用better-scroll插件的方法
2018/03/27 Javascript
使用vue-router与v-if实现tab切换遇到的问题及解决方法
2018/09/07 Javascript
简单的React SSR服务器渲染实现
2018/12/11 Javascript
用python + hadoop streaming 分布式编程(一) -- 原理介绍,样例程序与本地调试
2014/07/14 Python
Python编程判断一个正整数是否为素数的方法
2017/04/14 Python
Python 反转字符串(reverse)的方法小结
2018/02/20 Python
pandas每次多Sheet写入文件的方法
2018/12/10 Python
django框架用户权限中的session缓存到redis中的方法
2019/08/06 Python
Pycharm连接远程服务器过程图解
2020/04/30 Python
Python本地及虚拟解释器配置过程解析
2020/10/13 Python
HomeAway英国:全球领先的度假租赁在线市场
2020/02/03 全球购物
百度软件工程师职位
2013/02/14 面试题
班级道德讲堂实施方案
2014/02/24 职场文书
入职担保书怎么写
2014/05/12 职场文书
人工作失职检讨书
2015/05/05 职场文书
张丽莉观后感
2015/06/16 职场文书
教师师德承诺书2016
2016/03/25 职场文书
《童年》读后感(三篇)
2019/08/27 职场文书
oracle覆盖导入dmp文件的2种方法
2021/05/21 Oracle
Valheim服务器 Mod修改安装教程 【ValheimPlus】
2022/12/24 Servers