python中lxml 库之 etree 使用详解

news/2024/11/25 17:37:29/

目录

  • 一、 etree 介绍
  • 二、xpath 解析 html/xml
    • 1、第一步就是使用 etree 连接 html/xml 代码/文件。
    • 2、 xpath 表达式定位
      • ① xpath结合属性定位
      • ② xpath文本定位及获取
      • ③ xpath层级定位
      • ④ xpath索引定位
      • ⑤ xpath模糊匹配

一、 etree 介绍

lxml 库是 Python 中一个强大的 XML 处理库,简单来说,etree 模块提供了一个简单而灵活的API来解析和操作 XML/HTML 文档。

  • 官方网址:The lxml.etree Tutorial
  • 安装:pip install lxml

二、xpath 解析 html/xml

1、第一步就是使用 etree 连接 html/xml 代码/文件。

语法:

  • root = etree.XML(xml代码) #xml 接入
  • root = etree.HTML(html代码) #html 接入
  • 引入 from lxml import etree
python">from lxml import etreeroot = etree.XML("<root>data</root>")
print(root.tag)
#root
print(etree.tostring(root))
#b'<root>data</root>'root = etree.HTML("<p>data</p>")
print(root.tag)
#html
print(etree.tostring(root))
#b'<html><body><p>data</p></body></html>'

2、 xpath 表达式定位

xpath 使用路径表达式在 HTML/XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。 下面列出了最有用的路径表达式:

表达式描述
/从根节点选取(取子节点)
//任意节点,不考虑位置(取子孙节点)
.选取当前节点
选取当前节点的父节点
@选取属性
contain(@属性,“包含的内容”)模糊查询
text()文本内容

① xpath结合属性定位

  • html.xpath(“.//标签名[@属性=‘属性值’]”) #注意,这返回的是列表!!
  • [] :表示要根据属性找元素
  • @ :后边跟属性的key,表示要通过哪个属性定位
python">from lxml import etreeht = """<html><head><title>This is a sample document</title></head><body><h1 class="title">Hello!</h1><p>This is a paragraph with <b>bold</b> text in it!</p><p>This is another paragraph, with a<a href="http://www.python.org">link</a>.</p><p>Here are some reserved characters: &lt;spam&amp;egg&gt;.</p><p>And finally an embedded XHTML fragment.</p></body>
</html>"""html = etree.HTML(ht)title = html.xpath(".//h1[@class='title']")[0] #取列表中的第一个元素
print(etree.tostring(title))
#b'<h1 class="title">Hello!</h1>\n    '
print(title.get('class'))
# title

② xpath文本定位及获取

  • ele = html.xpath(“.//标签名[text()=‘文本值’]”)[0]
  • text1 = ele.text #获取元素文本1,ele为定位后的元素
  • text2 = html.xpath(“string(.//标签名[@属性=‘属性值’])”) #获取元素文本2,返回文本
  • text3 = html.xpath(“.//标签名[@属性=‘属性值’]/text()”) #获取元素文本3,返回文本列表
python">title1 = html.xpath(".//h1[text()='Hello!']")[0] #取列表中的第一个元素
text1 = title1.text
print(text1)
#Hello!
text2 = html.xpath("string(.//h1[@class='title'])")
print(text2)
#Hello!
text3 = html.xpath(".//h1[@class='title']/text()") #返回列表
print(text3)
#['Hello!']

③ xpath层级定位

实际开发时,若需求元素没有像 id、name、class 等基本属性,那么我们就需要借助相邻的元素定位,首先我们可以定位到相邻元素,然后通过层级关系来定位最终元素。

  • html.xpath(“.//父元素标签名[@父元素属性=‘父元素属性值’]/子元素标签名”) #由上到下的层级关系,目标是子元素
  • html.xpath(“.//子元素标签名[@子元素属性=‘子元素属性值’]/parent::父元素标签名”) #父子元素定位,目标是父元素在这里插入代码片
  • html.xpath(“.//元素标签名[@元素属性=‘元素属性值’]//preceding-sibling::哥哥元素标签名”) #哥哥元素定位,目标是哥哥元素
  • html.xpath(“.//元素标签名[@元素属性=‘元素属性值’]//following-sibling::弟弟元素标签名”) #弟弟元素定位,目标是弟弟元素
python">from lxml import etreeht = """<html><head><title>This is a sample document</title></head><body><h1 class="title">Hello!</h1><p>This is a paragraph with <b>bold</b> text in it!</p><p class="para">This is another paragraph, with a<a href="http://www.python.org">link</a>.</p><p>Here are some reserved characters: &lt;spam&amp;egg&gt;.</p><p>And finally an embedded XHTML fragment.</p></body>
</html>"""html = etree.HTML(ht)ele1 = html.xpath(".//p[@class='para']/a")[0] #由上到下的层级关系
print(etree.tostring(ele1))
#b'<a href="http://www.python.org">link</a>.'ele2 = html.xpath(".//a[@href='http://www.python.org']/parent::p")[0]#父子元素定位
print(etree.tostring(ele2))
#b'<p class="para">This is another paragraph, with a\n      <a href="http://www.python.org">link</a>.</p>\n    'ele3 = html.xpath(".//p[@class='para']//preceding-sibling::p")[0] #哥哥元素定位
print(etree.tostring(ele3))
#b'<p>This is a paragraph with <b>bold</b> text in it!</p>\n    'ele4 = html.xpath(".//p[@class='para']//following-sibling::p") #弟弟元素定位
for ele in ele4:print(etree.tostring(ele))#b'<p>Here are some reserved characters: &lt;spam&amp;egg&gt;.</p>\n    '#b'<p>And finally an embedded XHTML fragment.</p>\n  '

④ xpath索引定位

etree 结合 xpath 进行索引定位主要有两种方式,主要是因为 html.xpath() 返回的是一个列表。

  • html.xpath(“xpath表达式”)[0] #获取列表中第一个元素
  • html.xpath(“xpath表达式”)[-1] #获取列表中最后一个元素
  • html.xpath(“xpath表达式”)[-2] #获取列表中倒数第二个元素
python">ele1 = html.xpath(".//body/p")[0]
print(etree.tostring(ele1))
#b'<p>This is a paragraph with <b>bold</b> text in it!</p>\n    'ele1 = html.xpath(".//body/p")[-1]
print(etree.tostring(ele1))
#b'<p>And finally an embedded XHTML fragment.</p>\n  '

语法2:

  • html.xpath(“xpath表达式[1]”)[0] #获取第一个元素

  • html.xpath(“xpath表达式[last()]”)[0] #获取最后一个元素

  • html.xpath(“xpath表达式[last()-1]”)[0] #获取倒数第二个元素

     注:与python列表索引的概念不同,xpath 的标签索引是从1开始;python列表的索引是从0开始。
    

⑤ xpath模糊匹配

有时会遇到属性值过长的情况,此时我们可以通过模糊匹配来处理,只需要属性值的部分内容即可。

  • html.xpath(“.//标签名[start-with(@属性, ‘属性值开头’)]”) #匹配开头

  • html.xpath(“.//标签名[ends-with(@属性, ‘属性值结尾’)]”) #匹配结尾

  • html.xpath(“.//标签名[contains(text(), ‘部分文本’)]”) #包含部分文本

     注:ends-with方法是 xpath 2.0 的语法,而 etree 只支持 xpth 1.0,所以可能不会成功。
    
python">ele1 = html.xpath(".//p[starts-with(@class,'par')]")[0] #匹配开头
print(etree.tostring(ele1))
#b'<p class="para">This is another paragraph, with a\n      <a href="http://www.python.org">link</a>.</p>\n    'ele2 = html.xpath(".//p[ends-with(@class, 'ara')]")[0] #匹配结尾
print(etree.tostring(ele2))ele3 = html.xpath(".//p[contains(text(),'is a paragraph with')]")[0] #包含“is a paragraph with”
print(etree.tostring(ele3))
#b'<p>This is a paragraph with <b>bold</b> text in it!</p>\n    '

http://www.ppmy.cn/news/1549870.html

相关文章

小程序-基于java+SpringBoot+Vue的流浪动物救助小程序设计与实现

项目运行 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

LeetCode 4.寻找两个中序数组的中位数

力扣 4. 寻找两个正序数组的中位数 思路&#xff1a; 二分查找标记位计算中位数 细节&#xff1a; if (nums1.size() > nums2.size())return findMedianSortedArrays(nums2, nums1); 首先比较两个数组的大小&#xff0c;确保后续 nums1 的长度总是小于等于 nums2 的长度 …

如何控制自己玩手机的时间?两台苹果手机帮助自律

对一些人来说&#xff0c;被智能手机“绑架”是一件心甘情愿的事&#xff0c;和它相处的一天中&#xff0c;不必面对现实的压力&#xff0c;它就像个“舒适区”。这是因为在使用手机的过程中&#xff0c;应用程序&#xff08;尤其是游戏和社交媒体应用&#xff09;会不断刺激大…

企业OA管理系统:Spring Boot技术实现与案例研究

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了企业OA管理系统的开发全过程。通过分析企业OA管理系统管理的不足&#xff0c;创建了一个计算机管理企业OA管理系统的方案。文章介绍了企业OA管理系统的系统分析部…

深入浅出分布式缓存:原理与应用

文章目录 概述缓存分片算法1. Hash算法2. 一致性Hash算法3. 应用场景Redis集群方案1. Redis 集群方案原理2. Redis 集群方案的优势3. Java 代码示例:Redis 集群数据定位Redis 集群中的节点通信机制:Gossip 协议Redis 集群的节点通信:Gossip 协议Redis 集群的节点通信流程Red…

11.21作业

题目一&#xff1a; 题目&#xff1a; 函数fun功能&#xff1a;求出二维数组周边元素之和&#xff0c;作为函数值返回。 二维数组的值已经在主函数中赋予。 代码&#xff1a; #include <stdio.h> #define M 4 #define N 5///$ /// 函数fun功能&#xff1a;求出二维数…

以太事件解析 #6 事件侦听_01

背景 在前面的文章中其实简单的介绍过我们的区块链侦听服务的大概框架和模型&#xff0c;本身来说我们是有两个版本事件侦听&#xff0c;正常微服务的情况下我们会用到这个JAVA版本&#xff0c;其实还有一个python版本&#xff0c;那个主要是当时用来测试下大数据的情况下&…

Unity开发抖音小游戏使用长音频和短音频

抖音小游戏使用长音频和短音频 介绍WebGL对Unity音频的限制优化建议Iphone静音不同策略Unity中播放长音频无法播放可以使用以下方法总结 介绍 最近好久没有更新文章了&#xff0c;最近在研究抖音小程序也在帮公司做抖音小游戏这块&#xff0c;正好之前遇到了一个比较困扰的问题…