lxml 总结

news2024/12/29 8:41:38
  • xm 和 lxml库 哪个更好用点
1. 性能:
lxml 通常比 xml.etree.ElementTree 更快。lxml 使用了 C 编写的底层解析器,因此在处理大型 XML 文档时可能更高效。
如果性能对你的应用很重要,特别是在处理大型 XML 文件时,选择 lxml 可能是一个更好的选择。

2. 功能和灵活性:
lxml 提供了更多的功能和更灵活的 API,包括支持 XPath、XSLT 转换、XML Schema 验证等。
xml.etree.ElementTree 是 Python 的标准库的一部分,它提供了一组基本的 XML 处理工具,可以满足一般需求,但功能相对较简单。

3. 标准库 vs. 第三方库:
xml.etree.ElementTree 是 Python 的标准库的一部分,因此无需安装额外的库。这可能使得它更方便在没有额外依赖的环境中使用。
lxml 是一个第三方库,需要安装。在许多项目中,特别是涉及到网络请求和外部库的项目中,这可能是个小小的考虑因素。

4. API 的易用性:
xml.etree.ElementTree 提供了一个相对简单、易于学习和使用的 API。对于一些简单的 XML 处理任务,它可能足够了。
lxml 提供了更多的高级功能,但相应地也有更多的学习曲线。如果你不需要这些高级功能,可能会觉得 xml.etree.ElementTree 更轻量。
  • xpath表达式和 lxml表达式是一个概念吗
XPath 是一种用于在 XML 文档中定位元素的语言,而 lxml 是 Python 中一个常用的 XML 处理库,它使用 XPath 作为其中一种元素选择的方式。

因此,XPath 表达式是一种通用的语言概念,它独立于任何具体的编程语言。在使用 lxml 这个库时,你会使用 XPath 表达式来选择 XML 文档中的元素
  • tree.findall(“.ip”) 和 tree.xpath() 这两个函数的区别是
    注意:
    1. findall 方法用于查找当前元素的所有匹配子元素,
    2. 如果你的目的是仅匹配 元素本身,可以直接使用对 tree 变量的引用,因为 etree.fromstring(xml) 已经返回了 元素。在这种情况下,不需要使用 findall。
    3. 使用etree.fromstring构造文档树以后, 返回的就是树的根节点的引用, findall方法也是从当前节点开始查找,如果从 / 开始查找就会报错: SyntaxError: cannot use absolute path on element

    4. tree.xpath 和 tree.findall 都支持xpath表达式,但是在findall方法中,xpath表达式不能以 / 根路径开始
1. findall 是 lxml 库的方法,用于查找所有匹配指定元素名称的子元素。
它接受一个简单的元素名称作为参数,例如 .findall('.//element'),这里的 .//element 表示查找所有名称为 element 的元素,无论它们在文档的哪个位置。
返回的是一个元素列表。

2. xpath 方法是更强大的查询方法,使用 XPath 表达式来描述查询条件,因此更为灵活。
它接受一个 XPath 表达式作为参数,例如 .xpath('//element1'),这里的 //element1 表示查找文档中所有名称为 element1 的元素,无论它们在文档的哪个位置。
返回的同样是一个元素列表
  • lxml 文档树常用的api有哪些

lxml 中的 ElementTree 对象(通常通过 etree.fromstring() 或 etree.parse() 创建)有一些常用的方法和属性,以下是其中一些常见的 API:
1. Element 元素对象的方法和属性【tree本身就是元素对象,对应根元素】:

tag: 返回元素的标签名称。
text: 返回元素的文本内容。
attrib: 返回一个包含元素所有属性的字典。
get('attribute_name'): 获取指定属性的值。
set('attribute_name', 'value'): 设置指定属性的值。
clear(): 清除元素的内容。

2.  新建ElementTree 对象的方法:
etree.fromstring(xml_string): 从字符串中解析 XML 并返回 Element 对象。
etree.parse(file_path): 从文件中解析 XML 并返回 ElementTree 对象。
  eg: html = etree.parse(StringIO(test_html))
  
3. XPath 相关的方法, tree.xx:
xpath(xpath_expression): 使用 XPath 表达式查询匹配的元素,返回元素列表。
find(xpath_expression): 查找匹配的第一个元素并返回,如果没有匹配的则返回 None。
findall(xpath_expression): 查找匹配的所有元素并返回列表。
iterfind(xpath_expression): 返回一个迭代器,用于按需查找匹配的元素。

4.  from lxml import etree,etree的相关方法
etree.tostring(element): 将 Element 对象转换为字符串      #  etree.tostring(tree).decode()
etree.fromstring:  将字符串转换成 Element对象      # etree.fromstring(xml, parser=etree.XMLParser(huge_tree=True))
  • 常用的xpath表达式:
ips = tree.findall(".ip")
dhcp_range = tree.xpath("./ip[not(@family='ipv6')]/dhcp/range")
tree.xpath("./ip[@family='ipv6']/dhcp/range")
tree.xpath("/network/bandwidth")
tree.append(etree.fromstring(xml))
tree.xpath(f"/network/bandwidth/{direction}"):
tree.xpath("/domain/vcpus/vcpu")
tree.xpath("./devices/disk/target[@dev='{}']".format(target_dev))[0].getparent()
xml_disk = etree.tostring(disk_el).decode()
tree.set("secure", "ssss")
html = etree.parse(StringIO(test_html))
diskTree = doc.findall(f".//source[@file='{diskPath}']/..")[0]
diskTree2 = doc.xpath(f"//source[@file='{diskPath}']/..")

  • 工具类
def get_xml_path(xml, path=None, func=None):
    # doc_tree = etree.fromstring(xml)
    doc_tree = etree.fromstring(xml, parser=etree.XMLParser(huge_tree=True))
    if path:
        result = get_xpath(doc_tree, path)
    elif func:
        result = func(doc_tree)
    else:
        raise ValueError("'path' or 'func' is required.")
    return result


def get_xpath(doc_tree, path):
    result = None
    ret = doc_tree.xpath(path)
    if ret is not None:
        if isinstance(ret, list):
            if len(ret) >= 1:
                if hasattr(ret[0], "text"):
                    result = ret[0].text
                else:
                    result = ret[0]
        else:
            result = ret

    return result
  • 案例:
from lxml import etree

xml = """
<root>
  <ip>192.168.1.1</ip>
  <ip>192.168.1.2</ip>
  <ip>192.168.1.3</ip>
</root>
"""

tree = etree.fromstring(xml)

# 使用相对路径
ips = tree.findall(".//ip")

for ip_element in ips:
    print(ip_element.text)

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

shell编程系列(9)-使用cut选择列

文章目录 前言使用cut选择列选择特定的列 结语 前言 前面的文章介绍了sed命令&#xff0c;sed可以帮我们处理文本列&#xff0c;这边文章介绍cut命令&#xff0c;cut命令可以帮我们选择想要的列&#xff0c;在文本处理时候结合sed命令&#xff0c;就可以精准定位了。 cut命令是…

前端面试高频考点—TCP vs UDP

目录 简介&#xff1a; 区别&#xff1a; 应用选择&#xff1a; tcp为什么需要三次握手&#xff1f; 简介&#xff1a; TCP(传输控制协议)和UDP&#xff08;用户数据报协议&#xff09; TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff0c;是专门为了在不…

代码随想录算法训练营第三十六天| 435 无重叠区间 763 划分字母区间 56 合并区间

目录 435 无重叠区间 763 划分字母区间 56 合并区间 435 无重叠区间 将intervals数组按照左端点进行升序排序。 设置变量len标志此时新加入端点后所有区间的位置&#xff0c;将其赋初值为第一对区间的右端点&#xff0c;因为该点是一定可达的。设置变量res来存储需要移除空间…

【C语言】与文件有关的操作

目录 1. 前言2. 什么是文件&#xff1f;2.1 程序文件2.2 数据文件2.3 文件名 3. 二进制文件和文本文件&#xff1f;4. 文件的打开和关闭4.1 流和标准流4.1.1 流4.1.2 标准流 4.2 文件指针4.3 文件的打开和关闭 5. 文件的顺序读写5.1 顺序读写函数介绍5.2 对比一组函数 6. 文件的…

制作太阳能小车

今天偶然星期想搞一个太阳能小车耍一下子&#xff0c;那么接下来就介绍下相关的准备物品吧 首先介绍下需要准备的物品&#xff1a; 1、玩具车拆下四个轮子 2、小马达一个 3、1.5v太阳能板&#xff08;根据自己的需求购买相应的电压1.5v 3.7v 5v 12v等等&#xff09; 4、3D打…

Android Studio新版UI介绍

顶部菜单栏 左侧主要菜单入口项目名称分支名称 展开之后&#xff0c;主要功能与原来菜单栏功能一样&#xff0c;最大的变化就是把setting独立出去了。 而项目名称这里&#xff0c;展开就可以看到打开的历史工程列表&#xff0c;可以直接新建工程&#xff0c;原来需要在项目名称…

学习DNS

文章目录 一、DNS介绍二、DNS架构三、DNS的原理四、DNS软件安装和配置文件4.1、DNS正向解析4.2、DNS反向解析4.3、多域DNS4.4、DNS主从配置 一、DNS介绍 DNS&#xff08;Domain name system&#xff09;。 域名&#xff1a;由特定的格式组成&#xff0c;用来表示互联网中某一台…

[FUNC]判断窗口在哪一个屏幕上

#Requires AutoHotkey v2.0#z:: { ToolTip "Notepad窗口所在显示屏是&#xff1a;" GetMonitor() } GetMonitor() {CoordMode("Mouse", "Screen"); MouseGetPos &mx, &myWinGetPos &mx, &my,,,"ahk_class Notepad"…

记一次移动云不同机器下的对等网络使用

1、清单 机器1的VPC&#xff1a; 子网&#xff1a;172.16.16.0/24 机器2的VPC 子网&#xff1a;172.27.27.0/24&#xff08;子网不能与机器1的子网相同&#xff0c;否则对等网络无法成功建立&#xff09; 2、添加对等网络 添加链接&#xff1a;https://console.ecloud.1008…

二叉树展开为链表的三种写法

二叉树展开为链表 链表头节点法 新建一个树形链表&#xff0c;前序遍历这个树&#xff0c;遍历到一个节点就往里插 class Solution {TreeNode dummyNode new TreeNode(0,null,null);TreeNode p dummyNode;public void flatten(TreeNode root) {if(root null) return;//线序…

机器学习---EM算法

1. 极大似然估计与EM算法 极大似然估计是一种常用的参数估计方法&#xff0c;它是以观测值出现的概率最大作为准则。关于极 大似然估计&#xff0c;假设现在已经取到样本值了&#xff0c;这表明取到这一样本的概率L(θ) 比较 大。我们自然不会考虑那些不能使样本出现的θ作为…

Unity中Shader指令优化(编译后指令解析)

文章目录 前言一、我们先创建一个简单的Shader二、编译这个Shader&#xff0c;并且打开1、编译后注意事项2、编译平台 和 编译指令数3、顶点着色器用到的信息4、顶点着色器计算的核心部分5、片元着色器用到的信息6、片元着色器核心部分 前言 我们先读懂Shader编译后代码&#…

Pytorch——多卡GPU训练与单卡GPU训练相互切换

部分深度学习网络默认是多卡并行训练的&#xff0c;由于某些原因&#xff0c;有时需要指定在某单卡上训练&#xff0c;最近遇到一个&#xff0c;这里总结如下。 目录 一、多卡训练1.1 修改配置文件1.2 修改主训练文件1.3 显卡使用情况 二、单卡训练2.1 修改配置文件2.2 显卡使…

Linux 磁盘分区处理

最近实施过程中遇到客户提供给我们的服务器操作系统和Docke容器环境都已经安装完成&#xff0c;但磁盘的分区没有进行整理好。磁盘总共270G&#xff0c;系统安装分配了60G&#xff0c;剩余未创建分配需要处理。由于分区情况每家不一样&#xff0c;但大致流程都是相同的&#xf…

100.有序数组的平方(力扣)

代码解决一 class Solution { public:// 函数接受一个整数数组&#xff0c;返回每个元素平方值排序后的结果vector<int> sortedSquares(vector<int>& nums) {int len nums.size(); // 获取数组的长度vector<int> v; // 创建一个新的数组&#xff0c;用…

Redis基础系列-安装Redis

Redis基础系列-安装Redis 文章目录 Redis基础系列-安装Redis1. 环境要求2. 下载redis3. 安装4. 配置5 参考与感谢 1. 环境要求 &#xff08;安装C语言编译环境&#xff09;redis是用C语言开发的&#xff0c;所以需要安装C语言编译环境,中途可能会出现询问你是否需要可以安装&a…

SpringBoot——Quartz 定时任务

优质博文&#xff1a;IT-BLOG-CN 一、Scheduled 定时任务 【1】添加Scheduled相关依赖&#xff0c;它是Spring自带的一个jar包因此引入Spring的依赖&#xff1a; <dependency><groupId>org.springframework</groupId><artifactId>spring-context-su…

Maven无法拉取依赖/构建失败操作步骤(基本都能解决)

首先检查配置文件&#xff0c;确认配置文件没有问题(也可以直接用同事的配置文件(记得修改文件里的本地仓库地址)) 1.file->Invalidate Caches清除缓存重启(简单粗暴&#xff0c;但最有效) 2.刷新maven以及mvn clean&#xff0c;多刷几次&#xff0c;看看还有没有报红的依赖…

FastDFS文件系统本地部署结合Nginx与内网穿透实现远程访问本地服务器

文章目录 前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Nginx1.9 配置Nginx 2. 局域网测试访问FastDFS3. 安装cpolar内网穿透4. 配置公网访问地址5. 固定公网地址5.…

Python按要求从多个txt文本中提取指定数据

基本想法 遍历文件夹并从中找到文件名称符合我们需求的多个.txt格式文本文件&#xff0c;并从每一个文本文件中&#xff0c;找到我们需要的指定数据&#xff0c;最后得到所有文本文件中我们需要的数据的集合 举例 如现有名为file一个文件夹&#xff0c;里面含有大量的.txt格…