问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

python lxml etree怎么甩

发布网友 发布时间:2022-05-10 16:51

我来回答

1个回答

热心网友 时间:2022-05-10 18:20

lxml是Python语言中处理XML和HTML功能最丰富,最易于使用的库。

lxml是libxml2和libxslt两个C库的Python化绑定,它的独特之处在于兼顾了这些库的速度和功能完整性,同时还具有Python API的简介。兼容ElementTree API,但是比它更优越。

用libxml2编程就像是一个异于常人的陌生人的令人惊恐的拥抱,它看上去可以满足你一切疯狂的梦想,但是你的内心深处一直在警告你,你有可能会以最糟糕的方式遭殃,所以就有了lxml。



这是一个用lxml.etree来处理XML的教程,它简单的概述了ElementTree API的主要概念,同时有一些能让你的程序生涯更轻松的简单的提高。


首先是导入lxml.etree的方式:

from lxml import etree

为了协助代码的可移植性,本教程中的例子很明显可以看出,一部分API是lxml.etree在ElementTree API(由Fredrik Lundh 的ElementTree库定义)的基础上的扩展。

Element是ElementTree API的主要容器类,大部分XML tree的功能都是通过这个类来实现的,Element的创建很容易:

root = etree.Element("root")

element的XML tag名通过tag属性来访问

>>>print root.tag
root



许多Element被组织成一个XML树状结构,创建一个子element并添加进父element使用append方法:

>>>root.append(etree.Element("child1"))



还有一个更简短更有效的方法:the SubElement,它的参数和element一样,但是需要父element作为第一个参数:

>>>child2 = etree.SubElement(root,"child2")
>>>child3 = etree.SubElement(root,"child3")



可以序列化你创建的树:

>>>print(etree.tostring(root, pretty_print=True))
<root>
  <child1/>
  <child2/>
  <child3/>
</root>



为了更方便直观的访问这些子节点,element模仿了正常的Python链:

>>> child = root[0]>>> print(child.tag)
child1
>>> print(len(root))
>>> root.index(root[1]) # lxml.etree only!
>>> children = list(root)>>> for child in root:...     print(child.tag)child1child2
child3
>>> root.insert(0, etree.Element("child0"))>>> start = root[:1]>>> end   = root[-1:]>>> print(start[0].tag)child0>>> print(end[0].tag)child3


还可以根据element的真值看其是否有孩子节点:

if root:   # this no longer works!
    print("The root element has children")


用len(element)更直观,且不容易出错:

>>> print(etree.iselement(root))  # test if it's some kind of Element
True
>>> if len(root):                 # test if it has children
...     print("The root element has children")
The root element has children



还有一个重要的特性,原文的句子只可意会,看例子应该是能看懂什么意思吧。

>>> for child in root:...     print(child.tag)child0child1child2child3>>> root[0] = root[-1]  #移动了element>>> for child in root:...     print(child.tag)child3child1child2>>> l = [0, 1, 2, 3]>>> l[0] = l[-1]>>> l[3, 1, 2, 3]
>>> root is root[0].getparent()  # lxml.etree only!TrueIf you want to copy an element to a different position in lxml.etree, consider creating an independent deep copy using the copy mole from Python's standard library:>>> from copy import deepcopy>>> element = etree.Element("neu")>>> element.append( deepcopy(root[1]) )>>> print(element[0].tag)child1>>> print([ c.tag for c in root ])['child3', 'child1', 'child2']



XML支持属性,创建方式如下:

>>> root = etree.Element("root", interesting="totally")
>>> etree.tostring(root)
b'<root interesting="totally"/>'



属性是无序的键值对,所以可以用element类似于字典接口的方式处理:

>>> print(root.get("interesting"))
totally
>>> print(root.get("hello"))
None
>>> root.set("hello", "Huhu")
>>> print(root.get("hello"))
Huhu
>>> etree.tostring(root)
b'<root interesting="totally" hello="Huhu"/>'
>>> sorted(root.keys())
['hello', 'interesting']
>>> for name, value in sorted(root.items()):
...     print('%s = %r' % (name, value))
hello = 'Huhu'
interesting = 'totally'

如果需要获得一个类似dict的对象,可以使用attrib属性:

>>> attributes = root.attrib
>>> print(attributes["interesting"])
totally
>>> print(attributes.get("no-such-attribute"))
None
>>> attributes["hello"] = "Guten Tag"
>>> print(attributes["hello"])
Guten Tag
>>> print(root.get("hello"))
Guten Tag

既然attrib是element本身支持的类似dict的对象,这就意味着任何对element的改变都会影响attrib,反之亦然。这还意味着只要element的任何一个attrib还在使用,XML树就一直在内存中。通过如下方法,可以获得一个独立于XML树的attrib的快照:

>>> d = dict(root.attrib)
>>> sorted(d.items())
[('hello', 'Guten Tag'), ('interesting', 'totally')]

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
怎么养好四季海棠? 西安财神庙攻略,西安旅游攻略财神庙路线 漯河食品职业学院是几本 漯河食品职业学院是985还是211 做无痛人流的危害 地暖水压能保持多久 地暖水压维持时间有多长 海棠花开完花后该怎么处理 漯河食品职业学院为什么能升本 漯河食品职业学院质量检验系培养目标 漯河食品职业学院是谁建的 如何将excel中每人的工资单,通过word的邮件合并,再通过e-maill群发给工资单中每个人 邮件合并后发送文件,别人打开还一样吗? 目前来说,最好的投资理财网是哪一家? 民生信托主办的“得益于社会,奉献于社会———民生慈善信托发展论坛”是在哪举办的? 新开户到哪个证券公司比较好? 浅析人文科学的含义和作用 谈谈你对人文科学和自然科学的认识 你是如何看待“人文社会科学”这门学科? 对人文科学概论的理解 2020年长安信托媒体荣誉大盘点,都获得了哪些权威奖项? 如何详细解释人文科学? 信托方面的论坛 我是一名新手出纳,是的士公司,我现在手上有领款单,想问问这样怎么做,需要注意些什么? 最近怎么总是莫名奇妙的流鼻血? 你好经常莫名的流鼻血是怎么回事啊鼻子也不痛不 在实际做账中出纳做账的流程 最近老是莫名其妙的流鼻血这怎么回事啊? 关于出纳做账的问题 盈亏平衡点基本公式是什么? 盈亏平衡点是什么?怎么理解其对生产的建议? 如何利用邮件合并功能实现定时间隔地发送一批邮件? 装饰竣工验收发言稿 怎样用WORD邮件合并后用OUTLOOK 群发呀,急急急!!! 雪糕包装袋上的雪糕 平面怎么做 怎样把不被压缩的高清原图发到朋友圈, 一岁宝宝吃了东西就吐还拉肚子 一岁五个月宝宝吐了还拉肚子怎么办? 号称“9亿少女的梦”的林更新为什么最近没有作品上线了? 我要找设计雪糕包装的公司 他把垃圾穿在身上,狂揽500万粉丝,这样的网红你能接受吗? 如何同步接聊天记录? 有没有什么软件能把跑调的歌弄得好听点。 个人如何购买黄金?(金条)不需要买黄金产品,用于投资。 想买黄金保值,个人投资者有哪些途径? 11月26日天下足球开场的英文歌曲叫什么名字? 黄瓜有什么用处? 网上流传山东女人吃饭不上桌,是否为谣言? 喝醉酒后吃柿子可以解酒吗? 为什么别人都想娶山东姑娘? 我的班主任 作文怎么写