打卡学习Python爬虫第五天|Xpath解析的使用

什么是Xpath?是在XML文档中搜索内容的一门语言,HTML可以看作是xml的一个子集。

目录

1、安装lxml模块

2、导入lxml中的etree子模块

3、Xpath使用方法

3.1.选择节点

3.2.选择属性

3.3.选择文本内容

3.4.使用通配符*过滤节点

3.5.使用中括号[]索引

3.6.使用相对查找

3.7.使用函数

4、全部示例代码


1、安装lxml模块

# PyCharm终端输入
pip install lxml# 使用清华源
pip install lxml -i https://pypi.tuna.tsinghua.edu.cn/simple

2、导入lxml中的etree子模块

from lxml import etree

etree.XML().xpath() 是Python中用于XML解析的库 lxml 中的一个函数。lxml 是一个高效的XML解析器。另外,可以使用etree.parse("文件名")读取文件进行解析。

具体来说:

  • etree 是 lxml 库中的一个模块,它提供了访问XML文档的接口。
  • XML() 是 etree 模块中的一个函数,用于解析XML字符串。
  • xpath() 是 etree 模块中的一个方法,用于执行XPath查询。

etree.XML().xpath() 的含义是将一个XML字符串解析为一个lxmletree对象,然后使用这个对象执行XPath查询。

3、Xpath使用方法

XPath表达式通常以 / 开头,/ 表示层级关系,第一个 / 是根节点。

XPath是一种用于在XML文档中定位元素的语言。可使用一系列的语法规则来指定哪些元素应该被选中。xpath() 方法接受一个XPath表达式作为参数,并返回一个包含匹配元素的列表。

若有以下xml文档内容:

xml = '''
<book><id>10010</id><name>蔬菜</name><price>33</price><author><nick id="1">萝卜</nick><nick id="2">豆腐</nick><nick class="a">土豆</nick><nick id="3">白菜</nick><div><nick>西红柿</nick></div><span><nick>番茄</nick></span></author><partner><nick id="4">火锅</nick><nick id="5">麻辣烫</nick></partner>
</book>
'''
3.1.选择节点

 使用///来选择节点。

  • /book/author/nick:选择/book/author的直接子节点nick
  • /book/author//nick:选择/book/author的所有名为nick子节点,不论它们在文档中的位置。
# text()为获取文本内容/book/author/nick/text()
/book/author//nick/text()

3.2.选择属性

使用 @来选择元素的属性,如nick节点中的id属性且值为1。

/book/author/nick[@id=1]/text()

 如果想要属性的值

# 得到第i个id的值
/book/author/nick[i]/@id# 得到全部id的值
/book/author/nick/@id

3.3.选择文本内容

使用 text() 来选择节点的文本内

//book/name/text()

3.4.使用通配符*过滤节点

使用通配符 * 表示任意的节点。

/book/author/*/nick/text()# 相当于*代替了div和span,也就是说author和span之间可以是任意字符
/book/author/div/nick/text()
/book/author/span/nick/text()

3.5.使用中括号[]索引

获取/book/author下众多nick中的第一个nick,最后一个nick[last()]

/book/author/nick[1]/text()# 最后一个
/look/author/nick[last()]/text()

3.6.使用相对查找

先提取/book中每一个partner的信息,然后在partner中继续查找,./为当前节点,即partner节点

# 相对路径查询
result = tree.xpath("/book/partner")
for i in result:result1 = i.xpath("./nick/text()") #print(result1)

3.7.使用函数

函数可以用于计算或提取信息。

/book/author/nick[position()=2]/text()
# nick[position()=2]相当于nick[2]
/book/author/nick[2]/text()

count(//nick) # 获取nick节点的数量

4、全部示例代码

from lxml import etree
xml = '''
<book><id>10010</id><name>蔬菜</name><price>33</price><author><nick id="1">萝卜</nick><nick id="2">豆腐</nick><nick class="a">土豆</nick><nick id="3">白菜</nick><div><nick>西红柿</nick></div><span><nick>番茄</nick></span></author><partner><nick id="4">火锅</nick><nick id="5">麻辣烫</nick></partner>
</book>
'''
tree = etree.XML(xml) # 解析xml
# result = tree.xpath("/book")  # 获取根节点
# result = tree.xpath("/book/name")  # 获取子节点name
# result = tree.xpath("/book/name/text()") # 获取子节点name的文本内容
# result = tree.xpath("/book/author/nick/text()")  # 获取author的子nick节点的文本内容
# result1 = tree.xpath("/book/author//nick/text()") # 获取author节点下名为的所有nick节点的文本内容
# result = tree.xpath("/book/author/nick[@id=1]/text()") # 获取id=1的nick节点的文本内容
# result = tree.xpath("/book/author/*/nick/text()") # 获取author节点下所有nick节点的文本内容
# result = tree.xpath("/book/author/nick[1]/text()") # 获取author节点下第一个nick节点的文本内容
# result = tree.xpath("/book/author/nick/@id") # 获取author节点下所有nick节点的id属性值# 相对路径查询
# result = tree.xpath("/book/partner")
# for i in result:
#     result1 = i.xpath("./nick/text()") #
#     print(result1)# result = tree.xpath("count(//nick)") # 获取nick节点的数量
result = tree.xpath("/book/author/nick[position()=2]/text()") # 获取author节点下第二个nick节点的文本内容
print(result)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/408044.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java学习_20_File以及IO流

文章目录 前言一、FileFile中常见的成员方法判断和获取创建和删除获取和遍历 二、IO流IO流体系结构字节流字节输出流&#xff1a;FileOutputStream字节输入流FileInputStrea文件拷贝try……catch异常处理中文乱码现象 字符流字符流读取FileReader字符流输出FileWriter底层原理 …

Linux 命令集合

1. linux 系统版本 1.1 linux系统的分类 linux系统&#xff0c;主要分Debian系和RedHat系&#xff0c;还有其它自由的发布版本。 1、Debian系主要有Debian&#xff0c;Ubuntu&#xff0c;Mint等及其衍生版本&#xff1b; 2、RedHat系主要有RedHat&#xff0c;Fedora&#xf…

Springsecurity 自定义AuthenticationManager

一、认证流程 1、当用户提交了一个他的凭证(用户名、密码) AbstractAuthenticationProcessingFilter 将会创建一个凭证信息&#xff0c;最终&#xff0c;该请求会被UsernamePasswordAuthenticationFilter 拦截将请求中用户名和密码&#xff0c;封装为 Authentication 对象&…

C++ | Leetcode C++题解之第365题水壶问题

题目&#xff1a; 题解&#xff1a; class Solution { public:bool canMeasureWater(int x, int y, int z) {if (x y < z) {return false;}if (x 0 || y 0) {return z 0 || x y z;}return z % gcd(x, y) 0;} };

AI大模型进化之路:机器学习九大算法画图详解

机器学习算法对于了解AI大模型的意义非常重要&#xff0c;它们是构建、训练和应用AI大模型的基础和关键。今天给大家整理了一份机器学习核心算法资料&#xff0c;建议收藏学习。 集成学习是一种机器学习算法&#xff0c;它通过构建多个模型并整合它们的预测结果来提高性能。常…

ST 表算法

ST 表 ST 表&#xff0c;主要思想是空间换时间&#xff0c;用于解决可重复贡献问题和 RMQ 问题。 可重复贡献问题 指某个运算 o p op op&#xff0c;有 x o p x x x\ op\ x\ \ x x op x x 。例如 m a x ( x , x ) x m i n ( x , x ) x g c d ( x , x ) x max(x,x)x\…

【Docker】Docker学习01 | 什么是docker?

本文首发于 ❄️慕雪的寒舍 因为本人没有学习过docker&#xff0c;虽然部署过很多镜像&#xff0c;但是对于docker底层的实现一概不知。趁学习一个新项目的契机&#xff0c;将docker的相关概念了解清楚。 安装docker的教程请查看 Linux主机安装docker。 如果你想和我一起学习do…

TCP的连接建立及报文段首部格式

粘包问题&#xff1a; 原因&#xff1a;TCP流式套接字&#xff1b;数据与数据之间没有边界&#xff1b;导致可能多次的数据粘到一起。 解决办法&#xff1a; 规定一些数据与数据之间的间隔符&#xff0c;如&#xff1a;"\aa\", "\r\n"。指定要发送的数据…

exec函数簇

一、main 函数的参数定义 在C语言中&#xff0c;main 函数是程序执行的入口点。main 函数可以接受参数&#xff0c;这些参数通常用于从命令行接收输入。main 函数的参数定义通常遵循以下形式&#xff1a; int main(int argc, char *argv[]) 或者等价地&#xff1a; int mai…

91. UE5 RPG 实现拖拽装配技能以及解除委托的绑定

在上一篇文章里&#xff0c;实现了通过选中技能&#xff0c;然后点击下方的装备技能插槽实现了技能的装配。为了丰富技能装配功能&#xff0c;在这一篇里&#xff0c;我们实现一下通过拖拽技能&#xff0c;实现拖拽功能&#xff0c;我们需要修改两个用户控件&#xff0c;一个就…

杰发科技AC7840——CAN通信简介(8)_通过波特率和时钟计算SEG_1/SEG_2/SJW/PRESC

通过公式计算 * 波特率和采样点计算公式&#xff1a;* tSeg1 (S_SEG_1 2); tSeg2 (S_SEG_2 1).* BandRate (SCR_CLK / (S_PRESC 1) / ((S_SEG_1 2) (S_SEG_2 1))), SCR_CLK 为CAN 模块源时钟* SamplePoint (tSeg1 / (tSeg1 tSeg2)). {0x0D, 0x04, 0x04, 0x3B},…

文件IO和多路复用IO

目录 前言 一、文件 I/O 1.基本文件 I/O 操作 1.1打开文件 1.2读取文件内容 (read) 1.3写入文件 (write) 1.4关闭文件 (close) 2.文件指针 二、多路复用 I/O 1.常用的多路复用 I/O 模型 1.1select 1.2poll 1.3epoll 2.使用 select、poll 和 epoll 进行简单的 I/O…

软件测试最全面试题,了解一下

一、前言 近期有不少同学&#xff0c;朋友问我什么是软件测试&#xff0c;它是干什么的&#xff0c;我适不适合做、这行发展前景、工资怎么样等等等…在这里我把问题总结一下&#xff0c;整理一篇文章出来。 我也看过很多贴吧、论坛&#xff0c;在入行之前对这块都是迷茫的&a…

数据结构----栈

一丶概念 只能在一端进行插入和删除操作的线性表&#xff08;又称为堆栈&#xff09;&#xff0c;进行插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底 二丶特点 先进后出 FILO first in last out 后进先出 LIFO last in first out 三丶顺序栈 逻辑结构&…

Nginx: 配置项之http模块connection和request的用法以及limit_conn和limit_req模块

connection和request connection 就是一个连接, TCP连接 客户端和服务器想要进行通信的话&#xff0c;有很多种方式比如说, TCP的形式或者是UDP形式的通常很多应用都是建立在这个TCP之上的所以, 客户端和服务器通信&#xff0c;使用了TCP协议的话&#xff0c;必然涉及建立TCP连…

Java JNA调用C函数常见问题及解决方法

目录 1 undefined symbol&#xff1a;xxx2 Java映射C数组乱码3 Java使用String接收不到C函数返回的char*4 Unable to load DLL xxx.dll5 java.lang.UnsatisfiedLinkError: %1 不是有效的 Win32 应用程序6 无效的ELF头7 Structure array elements must use contiguous memory8 j…

msvcp120.dll丢失是怎么回事?几种靠谱修复msvcp120.dll的方法

在使用基于Windows的计算机进行日常工作或娱乐时&#xff0c;您可能会遇到一个错误消息&#xff1a;“无法启动此程序&#xff0c;因为计算机中丢失msvcp120.dll。”这样的提示通常在尝试启动某些程序或游戏时弹出&#xff0c;导致应用无法正常运行。这个问题通常与系统中的某个…

CSS3页面布局-三栏-固定宽度布局

布局的基本概念 多栏布局三种基本实现方案&#xff1a;固定宽度&#xff0c;流动&#xff0c;弹性。 固定宽度布局&#xff1a;大小不会随用户调整浏览器窗口大小。 一版960-1100,960常见&#xff0c;可以被3,4,5,6,8,10,12,16整除。 流动布局&#xff1a;大小会随用户调整…

数据结构——链式二叉树的实现与分治编程思维(c语言实现)

目录 前言&#xff1a; 1.前置说明 2.链式二叉树的遍历 2.1 前序&#xff0c;中序及后续遍历 2.2 前序遍历实现 2.3 中序遍历实现 2.4 后续遍历实现 3.结点个数以及高度等 3.1 结点个数 3.2 结点高度 3.3 叶子结点的个数 前言&#xff1a; 在之前的学习中&…

【图解秒杀系列】秒杀技术点——多级缓存、分层过滤

【图解秒杀系列】秒杀技术点——多级缓存、分层过滤 多级缓存本地缓存分布式缓存 分层过滤 多级缓存 多级缓存在秒杀系统中是非常重要的一个技术点&#xff0c;是应对秒杀场景瞬时高并发读请求的一种有效手段。通过在数据库前面加入多个缓存层&#xff0c;达到过滤掉大多数读请…