lxml 总结

  • 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.mfbz.cn/a/199334.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pycharm全网最新安装教程(附加activation code),支持2018-2023版本

官网地址Download PyCharm: Python IDE for Professional Developers by JetBrains 下载的话无脑下载安装即可&#xff01; 2018.2~2023版本用这个&#xff0c;最新的activation code码 2018.1以下版本用这个 老是审核不通过只能贴图片了&#xff08;T-T&#xff09;

发牌洗牌的简单逻辑

1. 需求分析 1.1 要求实现&#xff1a; 我们能使用一副牌&#xff0c;基本的实现多人炸金花小游戏。 1.2 实现分析&#xff1a; 1、有一副牌&#xff1a; 首先自定义card类&#xff0c;来定义每一张牌&#xff1b;&#xff08;牌上由花色和数字&#xff08;1~13&#xff09;&…

Vue框架学习笔记-Object.defineproperty函数

文章目录 前文提要Object.defineProperty作用Object.defineProperty参数使用例图getter&#xff0c;也就是get函数setter&#xff0c;也就是set函数 前文提要 本人仅做个人学习记录&#xff0c;如有错误&#xff0c;请多包涵 Object.defineProperty作用 当在js中声明了一个变…

物理层之码分复用(内含相关例题)

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

LeetCode [中等]3. 无重复字符的最长子串

3. 无重复字符的最长子串 - 力扣&#xff08;LeetCode&#xff09; 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 1. 滑动窗口&#xff08;Sliding Window&#xff09;&#xff1a; 滑动窗口是一种用于处理数组或列表的子数组或子序列的问题…

properties转yml

目前搜索到的大部分代码都存在以下问题&#xff1a; 复杂结构解析丢失解析后顺序错乱 所以自己写了一个&#xff0c;经过不充分测试&#xff0c;基本满足使用。可以直接在线使用 在线地址 除了yml和properties互转之外&#xff0c;还可以生成代码、sql转json等&#xff0c;可…

sqli-labs(6)

27. 过滤了union和select 使用双写绕过 有报错信息使用报错注入 1and(extractvalue(1,concat(0x5c,database())))and11 1and(updatexml(1,concat(0x7e,database(),0x7e),1))and11 1and(extractvalue(1,concat(0x5c,(selseselectlectect(group_concat(table_name))from(inform…

JVM 类加载

① 类加载过程 从上面的图片我们可以看出整个 JVM 执行的流程中&#xff0c;和程序员关系最密切的就是类加载的过程了&#xff0c;所以 接下来我们来看下类加载的执行流程。 对于一个类来说&#xff0c;它的生命周期是这样的&#xff1a; 其中前 5 步是固定的顺序并且也是类加载…

三十、elasticsearch集群

目录 一、集群的概念 1、节点 2、索引 3、分片和副本 二、集群的架构 三、集群的部署方式 1、单主节点 2、多主节点 3、安全集群 四、搭建ES集群 1、elasticsearch中集群节点有不同的职责划分 2、elasticsearch中的每个节点角色都有自己不同的职责&#xff0c;因此…

DockerCompose修改某个服务的配置(添加或编辑端口号映射)后如何重启单个服务使其生效

场景 docker-compose入门以及部署SpringBootVueRedisMysql(前后端分离项目)以若依前后端分离版为例&#xff1a; docker-compose入门以及部署SpringBootVueRedisMysql(前后端分离项目)以若依前后端分离版为例_docker-compose部署java mysql redis-CSDN博客 上面讲了docker c…

水库大坝安全在线监测系统守护水利工程的坚实屏障

随着科技的发展&#xff0c;水库大坝的安全监测已经进入了一个全新的时代。过去&#xff0c;我们无法实时监测大坝的安全状况&#xff0c;只能在灾难发生后进行补救&#xff0c;现在&#xff0c;通过WX-DB1水库大坝安全在线监测系统&#xff0c;我们能够在第一时间掌握大坝的运…

Android 如何让路由器或者其他AP设备获取到主机名

问题原因: 连接到AP设备后,发现主机名在路由器或者其他AP设备都无法正常显示 抓取tcpdump log发现DHCP request option中没有携带host name(Option 12)字段 如下图所示 修改方法: 将config_dhcp_client_hostname配置true后,可以看到host name了 具体代码逻辑如下 pack…

事件代理?

1.什么是事件代理&#xff1f; 事件代理也叫事件委托&#xff0c;只指定一个事件处理程序&#xff0c;就可以管理某一类型得事件。 可以简单理解为&#xff0c;事件代理就是将本应该绑定子元素事件绑定给父元素代理。它的优点就是&#xff1a;减少事件得执行&#xff0c;减少浏…

【技术干货】宇视IPC音频问题解决步骤

近期技术人员从宇视官网下载sdk进行二次开发时&#xff0c;在启动实时直播&#xff0c;并通过回调函数拿到流数据&#xff0c;发现没有音频流数据。 通过下面的数据发现&#xff0c;codeType此字段一直是28&#xff0c;代表的是H.264数据&#xff0c;但未没发现有音频的数据包…

2. 两数相加

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …

常见气体爆炸下限

国标中关于常见气体爆炸下限说明&#xff0c;特此记录 特此记录 anlog 2023年11月29日

LeetCode Hot100 739.每日温度

题目&#xff1a; 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 方法&…

AWS连甩3项Serverless创新,高效创建和操作缓存,用AI优化资源配置性价比

云创科技11月28日拉斯维加斯报道&#xff0c;在一年一度的AWS re:Invent首日&#xff0c;AWS实用计算高级副总裁Peter DeSantis延续Monday Night Live的传统&#xff0c;发表主题演讲并分享了AWS数据库和分析产品组合中的3项Serverless创新&#xff0c;以帮助客户在任何规模下分…

Java——》线性数据结构

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

Linux系统编程 day06 进程间通信

进程间通信 1. 进程间通信的概念2. 匿名管道pipe3. 命名管道FIFO4. 内存映射区 1. 进程间通信的概念 在Linux的环境下&#xff0c;进程地址空间是相互独立的&#xff0c;每个进程有着各自不同的用户地址空间。一个进程不能访问另一个进程中的内容&#xff0c;要进行数据交换必…