当前位置: 首页 > news >正文

打卡学习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)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 书生大模型实战营第三期基础岛第三课——浦语提示词工程实践
  • 城乡燃气安全监管平台 打造城市安全防护网
  • JavaJSON处理工具类JSONUtils
  • python-字符串排序(赛氪OJ)
  • 视频转音频mp3软件有哪些?分享好用的转换工具
  • docker具体操作
  • 一把手告诉你联盟营销白帽电商广告借力NewsBreak头条优势
  • 队列相关内容
  • YOLOv10改进 | 独家创新- 注意力篇 | YOLOv10结合全新多尺度线性注意力机制DSLAM和C2f_DSLAM(全网独家创新)
  • 安卓中synchronized 关键字 的作用和介绍
  • java 使用zookeeper包实现zookeeper分布式锁
  • [mongodb][配置]MongoDB中限制内存
  • Docker方式部署K8s集群
  • bash代码片段snippets
  • Oracle使用手册
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 【RocksDB】TransactionDB源码分析
  • js ES6 求数组的交集,并集,还有差集
  • mongo索引构建
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • MYSQL 的 IF 函数
  • oldjun 检测网站的经验
  • PHP变量
  • PV统计优化设计
  • Sass Day-01
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • Vue2.0 实现互斥
  • 高程读书笔记 第六章 面向对象程序设计
  • 马上搞懂 GeoJSON
  • 区块链共识机制优缺点对比都是什么
  • 全栈开发——Linux
  • 少走弯路,给Java 1~5 年程序员的建议
  • 说说动画卡顿的解决方案
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • ​2020 年大前端技术趋势解读
  • #define
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (回溯) LeetCode 40. 组合总和II
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (算法)硬币问题
  • (小白学Java)Java简介和基本配置
  • (源码分析)springsecurity认证授权
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .NET CORE Aws S3 使用
  • .Net 执行Linux下多行shell命令方法
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET中的十进制浮点类型,徐汇区网站设计