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缩进区别分析
Feb 15 Python
深入分析在Python模块顶层运行的代码引起的一个Bug
Jul 04 Python
Python中for循环和while循环的基本使用方法
Aug 21 Python
Python实现生成随机数据插入mysql数据库的方法
Dec 25 Python
对dataframe进行列相加,行相加的实例
Jun 08 Python
python 简单照相机调用系统摄像头实现方法 pygame
Aug 03 Python
使用Python实现微信提醒备忘录功能
Dec 04 Python
pytorch中的transforms模块实例详解
Dec 31 Python
如何利用Python识别图片中的文字
May 31 Python
python 实现批量图片识别并翻译
Nov 02 Python
python自动化之如何利用allure生成测试报告
May 02 Python
Python自动化工具之实现Excel转Markdown表格
Apr 08 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 调试工具Debug Tools
2011/04/30 PHP
PHP的异常处理类Exception的使用及说明
2012/06/13 PHP
免费手机号码归属地API查询接口和PHP使用实例分享
2014/04/10 PHP
PHP中使用file_get_contents post数据代码例子
2015/02/13 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
BOOM vs RR BO5 第二场 2.14
2021/03/10 DOTA
firefo xml 读写实现js代码
2009/06/11 Javascript
实现无刷新联动例子汇总
2015/05/20 Javascript
javascript中一些util方法汇总
2015/06/10 Javascript
JS实现的竖向折叠菜单代码
2015/10/21 Javascript
javascript的BOM
2016/05/03 Javascript
详解Node.js中exports和module.exports的区别
2017/04/19 Javascript
基于Node的React图片上传组件实现实例代码
2017/05/10 Javascript
bootstrap treeview 扩展addNode方法动态添加子节点的方法
2017/11/21 Javascript
仿京东快报向上滚动的实例
2017/12/13 Javascript
JS交互点击WKWebView中的图片实现预览效果
2018/01/05 Javascript
Node.js静态服务器的实现方法
2018/02/28 Javascript
node.js到底要不要加分号浅析
2018/07/11 Javascript
JavaScript监听触摸事件代码实例
2019/12/30 Javascript
Element Dropdown下拉菜单的使用方法
2020/07/26 Javascript
js实现详情页放大镜效果
2020/10/28 Javascript
Python运用于数据分析的简单教程
2015/03/27 Python
Python的Flask框架中集成CKeditor富文本编辑器的教程
2016/06/13 Python
python字符串过滤性能比较5种方法
2017/06/22 Python
Python基于回溯法子集树模板解决0-1背包问题实例
2017/09/02 Python
对pandas中Series的map函数详解
2018/07/25 Python
体育教育毕业生自荐信
2013/11/21 职场文书
五一服装活动方案
2014/01/11 职场文书
网站客服岗位职责
2014/04/05 职场文书
《草原的早晨》教学反思
2014/04/08 职场文书
医院合作协议书
2014/08/19 职场文书
酒店餐厅2014重阳节活动策划方案
2014/09/16 职场文书
用人单位聘用意向书
2015/05/11 职场文书
在python中实现导入一个需要传参的模块
2021/05/12 Python
nginx共享内存的机制详解
2022/03/21 Servers
python+pytest接口自动化之token关联登录的实现
2022/04/06 Python