python xml xpath定位_python之Xpath语法-程序员宅基地

技术标签: python xml xpath定位  

python视频教程栏目介绍python的Xpath语法。

一、XMl简介

(一)什么是 XMLXML 指可扩展标记语言(EXtensible)

XML 是一种标记语言,很类似 HTML。

XML 的设计宗旨是传输数据,而非显示数据。

XML 的标签需要我们自行定义。

XML 被设计为具有自我描述性。

XML 是 W3C 的推荐标准。

W3School 官方文档:http://www.w3school.com.cn/xml/index.asp

(二)XML 和 HTML 的区别

他们两者都是用于操作数据或者结构数据,在结构上大致相同的,但他们在本质上却存在着明显的区别。数据格式描述设计目标XMLExtensible Markup Language ( 可扩展标记语言)被设计为传输和存储数据,其焦点是数据的内容。

HTMLHyperText Markup Language(超文本标记语言)显示数据以及如何更好显示数据。

HTML DOMDocument Object Model for HTML(超文本标文档对象模型)通过 HTML DOM,可以访问所有的 HTML 元素, 连同它们所包含的文本和属性。可以对其中的内容进行修改和删除,同时也可以创建新的元素。

(三)XML 的节点关系<?XML version='1.0' encoding=""utf-8>

Harry Potter

J K.Rowling

2005

29.00

1.父(Parent)

每个元素以及属性都有一个父。上面是一个简单的 XML 例子中,book 元素是 title、author、year 以及 price 元素的父

2.子(Children)

元素节点可有零个、一个或多个子元素。在上面的例子中,title、author、year 以及 price 元素都是 book 元素的子元素

3. 同胞(Sibling)

拥有相同的父的节点。在上面的例子中,title、author、year 以及 price 元素都是同胞

4. 先辈(Ancestor)

某节点的父、父的父,等等。在上面的例子中,title 元素的先辈是 book 元素和 bookstore元素

5. 后代(Descendant)

某个节点的子,子的子等等。在上面的例子中,bookstore 的后代是 book、title、author、year 以及 price 元素:

二、XPATH

XPath (XML Path Language) 是一门在 XML 文档中查找信息的语言,可用来在 XML 文档中对元素和属性进行遍历。

(一)选取节点

XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。下面列出了最常用的路径表达式:表达式描述nodename选取此节点的所有子节点。

/从节点选取。

//从匹配选择的当前节点选择文档中的节点,而不考虑他们的位置。

.选取当前节点。

..选取当前节点的父节点。

@选取属性。

在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:路径表达式描述bookstore选取 bookstore 元素的所有子节点

/bookstore选取根元素 bookstore。代表元素的绝对路径。

bookstore/book选取属于 bookstore 的子元素的所有 book 元素。

//book选取所有 book 子元素,而不管它们在文档中的位置

bookstore//book选择属于 booksore 元素的后代所有的 book 元素,而不管他们位于 bookstore 之下的什么位置。

//@lang选取名为 lang 的所有属性。

text()取标签当中的值

(二)谓语(Predicates)

谓语用来查找某个特定的节点或者包含某个指定的值的节点,被嵌在方括号中。在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:路径表达式描述/bookstore/book[l]选取属于 bookstore 子元素的第一个 book 元素。

/bookstore/book[last()]选取属于 bookstore 子元素的最后一个 book 元素。

/bookstore/book[last()-1]选取属于 bookstore 子元素的倒数第二个 book 元素。

/bookstore/book[position()<2]选最前面的一个属于 bookstore 元素的子元素的 book 元素。

//title[@lang]选取所有属性名为 lang 的属性的 title 元素。

//titlel@lang=‘eng’]选取所有 tltle 元素,且这些元素有属性值为 eng 的 lang 属性。

(三)选取未知节点

XPath 通配符可用来选取未知的 XML 元素。通配符描述*匹配任何元素节点。

@*匹配任何属性节点。

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:路径表达式描述/bookstore/*选取 bookstore 元素的所有子元素

//*选取文档中的所有元素。

//title[@*]选取所有带有属性的 title 元素。

(四)选取若干路径

通过在路径表达式中使用“|”运算符,您可以选取若干个路径。在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:路径表达式描述//book/title//book/price

//title//price

//price选取文档中所有的 price 元素。

三、lxml 模块

(一)lxml 简介与安装

lxml 是一个 HTML/XML 的解析器,主要的功能是如何解析和提取 HTML/XML 数据。我们可以利用之前学习的 XPath 语法,来快速的定位特定元素以及节点信息。

安装方法:pip install lxml

(二)lxml 初步使用

1、解析HTML字符串

XML 素材:http://www.cnblogs.com/zhangboblogs/p/10114698.html

小结:lxml 可以自动修正 html 代码,例子里不仅补全了 li 标签,还添加了 body,html 标签。

2.、lxml 文件读取

XML 素材:http://www.cnblogs.com/zhangboblogs/p/10114698.htm

除了直接读取字符串,lxml 还支持从文件里读取内容。我们新建一个 hello.html 文件,再利用 etree.parse()方法来读取文件。

注意:从文件中读取数据,要求文件内容符合 xml 格式,如果标签缺失,则不能正常读取。

四、XPath 节点信息解析:# 安装lxml: pip install lxml

# 1. 导入etree: 两种导入方式

# 第一种: 直接导入

from lxml import etree

# 注意: 此种导入方式,可能会导致报错(etree下面会出现红色波浪线,不影响正常使用)

# 第二种:

# from lxml import html

# etree = html.etree

str = '' \

'' \

'

Harry Potter' \

'29.99' \

'' \

'' \

'

Learning XML' \

'39.95' \

'' \

'' \

'

西游记' \

'69.95' \

'' \

'' \

'

水浒传' \

'29.95' \

'' \

'' \

'

三国演义' \

'29.95' \

'' \

''

# 2. etree.HTML() 将字符串转换成HTML元素对象,可以自动添加缺失的元素

html = etree.HTML(str) # 是一个el对象

# print(html)

# 3. 方法:

# 3.1 tostring() 查看转换之后的内容(二进制类型)

# 如果想要查看字符串,需要解码

# 如果想要显示汉字,需要先编码,再解码

# content = etree.tostring(html,encoding='utf-8')

# print(content.decode())

# 3.2 xpath()方法 作用:提取页面数据,返回值是一个列表

# xpath的使用一定是建立在etree.HTML()之后的内容中的

# xpath是如何来提取页面数据的?

# 答:使用的是路径表达式

# 3.2.1 xpath路径分为两种:

# 第一种: / 代表一层层的查找,如果/存在于开头,代表根路径

# bookstore = html.xpath('/html/body/bookstore')

# print(bookstore) # []

# 第二种: // 任意路径 焦点在元素身上

# 例如:查找bookstore标签

# bookstore = html.xpath('//bookstore')

# print(bookstore) # []

# 第一种和第二种结合

# 例如:查找所有book标签

# book = html.xpath('//bookstore/book')

# print(book) # [, , , , ]

# 3.2.2 /text() 获取标签之间的内容

# 例如:获取所有title标签的内容

# 步骤:

# 1. 找到所有title标签

# 2. 获取内容

# title = html.xpath('//book/title/text()')

# print(title) # ['Harry Potter', 'Learning XML', '西游记', '水浒传', '三国演义']

# 3.3 位于 使用[] 可以理解成条件

# 3.3.1 [n] 代表获取第n个元素,n是数字,n<=1

# 例如: 获取第二个title标签

# title = html.xpath('//book[2]/title/text()')

# title1 = html.xpath('//title[2]/text()')

# print(title) # ['Learning XML']

# print(title1) # []

# last() 获取最后一个

# 同理: last()-1 获取倒数第二个

# 例如: 获取最后一本书的title标签之间的内容

# title = html.xpath('//book[last()]/title/text()')

# title1 = html.xpath('//book[last()-1]/title/text()')

# print(title) # ['三国演义']

# print(title1) # ['水浒传']

# 3.3.2 position() 位置,范围 支持 > / < / = / >= / <= / !=

# 例如: 获取最后两本书的title标签之间的内容

# 步骤:

# 1. 先获取后两本书

# 2. 获取内容

# title = html.xpath('//book[position()>3]/title/text()')

# print(title) # ['水浒传', '三国演义']

# ? title = html.xpath('//book[position()>last()-2]/title/text()')

# print(title) # ['水浒传', '三国演义']

# 3.3.3 获取属性值:@属性名

# 例如: 获取lang属性值为cng的title标签的内容

# title = html.xpath('//book/title[@lang="cng"]/text()')

# print(title) # ['西游记']

# 例如: 获取包含src属性得title标签的内容

# title = html.xpath('//book/title[@src]/text()')

# print(title) # ['Harry Potter', '水浒传', '三国演义']

# 例如: 获取包含属性的title标签的内容

# title = html.xpath('//book/title[@*]/text()')

# print(title) # ['Harry Potter', 'Learning XML', '西游记', '水浒传', '三国演义']

# 例如: 获取最后一个title标签的src属性的值

# title = html.xpath('//book[last()]/title/@src')

# print(title) # ['https://www.jd.com']

# 例如: 获取所有包含src属性的标签之间的内容

# node = html.xpath('//*[@src]/text()')

# print(node) # ['Harry Potter', '水浒传', '三国演义']

# 3.4 and 与 连接的是谓语(条件)

# 例如: 获取lang="dng"并且class="t1"的title标签的内容

# title = html.xpath('//book/title[@lang="dng" and @class="t1"]/text()')

# title1 = html.xpath('//book/title[@lang="dng"][@class="t1"]/text()')

# print(title) # ['三国演义']

# print(title1) # ['三国演义']

# 3.5 or 或 连接谓语

# 例如: 查找lang="cng"或者lang="bng"的title标签的内容

# title = html.xpath('//book/title[@lang="cng" or @lang="bng"]/text()')

# print(title) # ['Harry Potter', '西游记']

# 3.6 | 连接路径

# 例如: 获取所有title标签和price标签之间的内容

# title = html.xpath('//title/text() | //price/text()')

# print(title) # ['Harry Potter', '29.99', 'Learning XML', '39.95', '西游记', '69.95', '水浒传', '29.95', '三国演义', '29.95']

# 3.8 parse() 作用:从文件中读取数据

# 注意: 读取的文件,必须满足xml格式**(不存在单标签,全部都是上标签)**

content = etree.parse('test.html')

# print(content) #

res = etree.tostring(content,encoding='utf-8')

print(res.decode())

test

这是一个html

相关免费学习推荐:python视频教程

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39996762/article/details/110959784

智能推荐

AI Mass人工智能大模型即服务时代:AI Mass平台的关键构成-程序员宅基地

文章浏览阅读148次。作者:禅与计算机程序设计艺术 1.背景介绍近年来,随着人工智能技术的飞速发展和应用爆炸性增长,人们越来越多地将目光投向了人工智能领域,尤其是端到端的端到端的人工智能解决方案。人工智能(AI)可以助力创新经济、科技创业和社会变革等方面,也是当今世界最迫切的技术需求之一。虽然人工智能领域已经取得了极大_mass平台

对串行与并行通信的理解_对并行通信基本方式实验有什么认识-程序员宅基地

文章浏览阅读396次。电子设备通过发送数据位从而实现相互交谈。位是二进制的,只能是1或0。通过电压的快速变化,位从一个设备传输到另一个设备。**在以5V工作的系统中,“0”通过0V的短脉冲进行通信,而“1”通过5V的短脉冲进行通信。 **数据位可以通过并行或串行的形式进行传输。在串行通信中,位通过单根线一一发送。下图显示了二进制(01000011)中字母“C”的串行传输:**在并行通信中,数据位在导线上同时传输。**下图显示了二进制(01000011)中字母“C”的并行传输:..._对并行通信基本方式实验有什么认识

微擎登录后,直接跳转到应用后台_php itoast-程序员宅基地

文章浏览阅读4.2k次,点赞2次,收藏11次。微擎版本: v2.5.4根目录\web\source\user\login.ctrl.php底部找到itoast("欢迎回来,{$record['username']}。", $forward, 'success');代码,在前面添加$forward ='./index.php?c=home&a=welcome&do=ext&m=模块名';最终isetcookie('__uid', '1', 7 * 86400);isetcookie('__uniacid', '_php itoast

unity3d著名项目-Dark Tree翻译_unity3d项目-程序员宅基地

文章浏览阅读1.5k次。Dark Tree组件概述•性格和生活统计•武器•控制器动画•库存和物品•建筑系统•教程和帮助感谢您购买DTFPS。此游戏模板允许您轻松制作生存游戏原型。在本手册中,我想对项目中使用的工具和方法以及一些入门教程该资产的主要目标是提供简单的设置体验和使射击游戏快速的能力但请记住,您的游戏需要的工作远不止资产商店中的现成模板。 它会 不是自己为您制作游戏,而是会给您一个很好的起点。 有时你仍然需要工作 如果您想扩展包并使您的游戏真正独特和原创,请使用代码。 如果你熟悉 C# 并且可以编写_unity3d项目

优化问题中的模拟退火算法详解-程序员宅基地

文章浏览阅读859次,点赞21次,收藏21次。1.背景介绍优化问题是指求解一个函数最大化或最小化的问题,常常需要寻找函数的极值点。模拟退火算法(Simulated Annealing, SA)是一种用于解决优化问题的随机搜索方法,它的基本思想是将优化问题与退火过程(如金属熔化过程)相联系,通过随机搜索和温度控制来逐步找到问题的最优解。模拟退火算法的核心思想是:当系统处于高温状态时,允许产生较大的变化,从而有可能跳出当前的局部最优解;当..._模拟退火算法可以解决什么问题

如何查看EasyNTS智能云组网硬件终端内的资源使用情况?_easynts 拆机-程序员宅基地

文章浏览阅读212次。之前我们讲到视频云组网EasyNTS主要是进行网络穿透的设备(EasyNTS可以进行网络设备穿透吗?),涉及到这类硬件设备,必然涉及到资源使用的情况。所以本文我们就来讲一下我们的智能云组网 EasyNTS硬件终端怎么获取资源使用情况。想要查看EasyNTS当前硬件资源使用情况,可以telnet进入EasyNTS硬件终端,使用top命令,获取到当前EasyNTS终端的CPU及内存等使用情况。下面是操作步骤,大家可以按此步骤来:1、本地电脑和EasyNTS硬件在同一局域网中,通过CMD命令行输入:t_easynts 拆机

随便推点

python求解二元函数的值_python 求二元函数极值-程序员宅基地

文章浏览阅读2.2k次,点赞3次,收藏10次。python求解二元函数表达式的值小白上路,将每次学习到的一点点积累在这,便于以后查阅。通过定义函数实现// An highlighted blockvar foo = 'bar';生成一个适合你的列表项目项目项目项目1项目2项目3 计划任务 完成任务创建一个表格一个简单的表格是这么创建的:项目Value电脑$1600手机$12导管$1设定内容居中、居左、居右使用:---------:居中使用:-----_python 求二元函数极值

Python读取文件时出现UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position xx: 解决方案_unicodedecodeerror: 'utf-8' codec can't decode byt-程序员宅基地

文章浏览阅读10w+次,点赞93次,收藏97次。Python在读取文件时with open('article.txt') as f: # 打开新的文本 text_new = f.read() # 读取文本数据出现错误:UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 145: illegal multibyte sequence此..._unicodedecodeerror: 'utf-8' codec can't decode byte 0x80 in position 64: inv

linux设备模型:sysfs(kobject)解析_sysfs_remove_group-程序员宅基地

文章浏览阅读1.1k次。sysfs 是一个最初基于 ramfs 且位于内存的文件系统。它提供导出内核数据结构及其属性,以及它们之间的关联到用户空间的方法。任何 kobject 在系统中注册,就会有一个目录在 sysfs 中被创建。这个目录是作为该 kobject 的父对象所在目录的子目录创建的,以准确地传递内核的对象层次到用户空间。sysfs中的顶层目录代表着内核对象层次的共同祖先;例如:某些对象属于某个子系统。 在与其目录关联的 kernfs_node 对象中内部保存一个指向实现目录的_sysfs_remove_group

DAMSL标注体系-程序员宅基地

文章浏览阅读492次。原始文献:Dialogue Act Makeup in Several Layers,Allen and Core 1997DAMSL标注体系是普通开放对话领域的标注体系。 面对二人的对话设计,主要对高层结构进行标注,针对具体的对话内容可以适当扩展。#有很多扩展标注体系,基本上大同小异。另,标注体系分普通开放对话领域和特殊领域的标注体系,DAMSL是开放域代表,形式参考下方的 SWBD-DA..._damsl

echarts图表的使用及用法-程序员宅基地

文章浏览阅读5.1k次。一、介绍ECharts,一个纯 Javascript 的图表库,可以流畅的运行在PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等),底层依赖轻量级的 Canvas 类库 ZRender,提供直观,生动,可交互,可高度个性化定制的数据可视化图表。ECharts 提供了常规的折线图,柱状图,散点图,饼图,K线图,用于统计的盒形图,用于地理数据可视化的地图,热力图,线图,用于关系数据可视化的关系图,treemap,多维数据可视化的平行坐标,还_echarts图表

【正点原子MP157连载】第七章 认识HAL库-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南_hal_syscfg_analogswitchconfig-程序员宅基地

文章浏览阅读1.6k次,点赞3次,收藏8次。1)实验平台:正点原子STM32MP157开发板2)购买链接:https://item.taobao.com/item.htm?&id=6292707218013)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-318813-1-1.html4)正点原子官方B站:https://space.bilibili.com/3946208905)正点原子STM32MP157技术交流群:691905614第七章 认识HAL库第四章生成的工程是基于HA_hal_syscfg_analogswitchconfig