菜鸟学Python”,抉择“星标”公家号
超等无敌干货,第一时间送达!!!
各人好,我是菜鸟哥。
我们经常需要解析用差别语言编写的数据,Python 供给了许多第三方库来解析或拆分用其他语言编写的数据,今天我们来进修下 Python XML 解析器的相关功用。
下面一路来看看吧~
什么是 XML?
XML 是可扩展标识表记标帜语言,它在外看上类似于 HTML,但 XML 用于数据表达,而 HTML 用于定义正在利用的数据。XML 专门设想用于在客户端和办事器之间往返发送和领受数据。看看下面的例子:
?xml version="1.0" encoding="UTF-8"?
metadata
food
itemname= "breakfast" Idly / item
price $2.5 / price
deion
Two idly's with chutney
/ deion
calories 553 / calories
/ food
food
itemname= "breakfast" Paper Dosa / item
price $2.7 / price
deion
Plain paper dosa with chutney
/ deion
calories 700 / calories
/ food
food
itemname= "breakfast" Upma / item
price $3.65 / price
deion
Rava upma with bajji
/ deion
calories 600 / calories
/ food
food
itemname= "breakfast" Bisi Bele Bath / item
price $4.50 / price
deion
Bisi Bele Bath with sev
/ deion
calories 400 / calories
/ food
food
itemname= "breakfast" Kesari Bath / item
price $1.95 / price
deion
Sweet rava with saffron
/ deion
calories 950 / calories
/ food
/ metadata
上面的示例展现了定名为“Sample.xml”的文件的内容,后面的代码示例城市基于此 XML 例子来停止。
Python XML 解析模块
xml.etree.ElementTree 模块:
该模块搀扶帮助我们将 XML 数据格局化为树构造,那是分层数据的最天然表达。元素类型容许在内存中存储分层数据构造,并具有以部属性:
Property
Deion
Tag
一个字符串,表达正在存储的数据类型
Attributes
由存储为字典的许多属性构成
Text String
包罗需要展现的信息的文本字符串
Tail String
若有需要,也能够有尾弦
Child Elements
由许多存储为序列的子元素构成
ElementTree 是一个封拆元素构造并容许与 XML 彼此转换的类,如今让我们测验考试利用 python 模块解析上述 XML 文件。
有两种办法能够利用 ElementTree 模块解析文件。
第一个是利用 parse 函数,第二个是 fromstring 函数。 parse 函数解析做为文件供给的 XML 文档,而 fromstring 在做为字符串供给时解析 XML,即在三引号内。
利用 parse 函数:
如前所述,该函数摘用文件格局的 XML 停止解析,看看下面的例子:
importxml.etree.ElementTree asET
mytree = ET.parse( 'sample.xml')
myroot = mytree.getroot
我们需要做的第一件事是导进 xml.etree.ElementTree 模块,然后利用 parse 办法解析“Sample.xml”文件, getroot 办法返回“Sample.xml”的根元素。
当施行上述代码时,我们不会看到返回的输出,但只要不会有错误就表白代码已胜利施行。要查抄根元素,能够简单地利用 print 语句,如下所示:
importxml.etree.ElementTree asET
mytree = ET.parse( 'sample.xml')
myroot = mytree.getroot
print(myroot)
Output:
Element ‘metadata’ at 0x033589F0
上面的输出表白我们的 XML 文档中的根元素是“元数据”。
利用 fromstring 函数
我们还能够利用 fromstring 函数来解析字符串数据,我们需要将 XML 做为三引号内的字符串传递,如下所示:
importxml.etree.ElementTree asET
data= '''?xml version="1.0" encoding="UTF-8"?
metadata
food
item name="breakfast"Idly/item
price$2.5/price
deion
Two idly's with chutney
/deion
calories553/calories
/food
/metadata
myroot = ET.fromstring(data)
#print(myroot)
print(myroot.tag)
上面的代码将返回与前一个不异的输出,用做字符串的 XML 文档只是“Sample.xml”的一部门,已将其用于进步可见性,也能够利用完全的 XML 文档。
还能够利用“标签”对象检索根标签,如下所示:
print(myroot.tag)
Output:
metadata
还能够通过仅指定要在输出中看到的字符串部门来对标识表记标帜字符串输出停止切片。
print(myroot.tag[ 0: 4])
Output:
meta
如前所述,标签也能够具有字典属性。要查抄根标签能否有任何属性,您能够利用“attrib”对象,如下所示:
print(myroot.attrib)
Output:
能够看到,输出是一个空字典,因为我们的根标签没有属性。
觅觅感兴致的元素
根也由子标签构成,要检索根标签的子标签,能够利用以下号令:
print(myroot[ 0].tag)
Output:
food
如今,假设要检索根的所有第一个子标识表记标帜,能够利用 for 轮回对其停止迭代,如下所示:
forx inmyroot[ 0]:
print(x.tag, x.attrib)
Output:
item {‘name’: ‘breakfast’}
price {}
deion {}
calories {}
返回的所有项目都是食物的子属性和标签。
要利用 ElementTree 从 XML 平分别出文本,能够利用 text 属性。例如,假设想检索关于第一个食物的所有信息,应该利用以下代码:
forx inmyroot[ 0]:
print(x.text)
Output:
Idly
$2.5
Two idly’s with chutney
553
能够看出,第一项的文本信息已做为输出返回。如今假设想以特订价格展现所有商品,能够利用 get 办法,此办法拜候元素的属性。
forx inmyroot.findall( 'food'):
item =x.find( 'item').text
price = x.find( 'price').text
print(item, price)
Output:
Idly $2.5
Paper Dosa $2.7
Upma $3.65
Bisi Bele Bath $4.50
Kesari Bath $1.95
上面的输出展现了所有必须的项目以及每个项目标价格,利用 ElementTree,还能够修改 XML 文件。
修改 XML 文件
我们的 XML 文件中的元素是能够被把持的,为此,能够利用 set 函数。让我们先来看看若何在 XML 中添加一些工具。
添加到 XML:
以下示例展现了若何在项目描述中添加内容。
fordeion inmyroot.iter( 'deion'):
new_desc = str(deion.text)+ 'wil be served'
deion.text = str(new_desc)
deion.set( 'updated', 'yes')
mytree.write( 'new.xml')
write 函数有助于创建一个新的 xml 文件并将更新的输出写进该文件,但是也能够利用不异的功用修改原始文件。施行上述代码后,将可以看到已创建一个包罗更新成果的新文件。
上图展现了我们食物项目标修改描述。要添加新的子标签,能够利用 SubElement 办法。例如,假设想在第一项 Idly 中添加新的专业标签,能够施行以下操做:
ET.SubElement(myroot[ 0], 'speciality')
forx inmyroot.iter( 'speciality'):
new_desc = 'South Indian Special'
x.text = str(new_desc)
mytree.write( 'output5.xml')
Output:
就像我们所见到的,在第一个食物标签下添加了一个新标签。能够通过在 [] 括号内指定下标来在肆意位置添加标签。
下面让我们看看若何利用那个模块删除项目。
从 XML 中删除:
要利用 ElementTree 删除属性或子元素,能够利用 pop 办法,此办法将删除用户不需要的所需属性或元素。
myroot[ 0][ 0].attrib.pop( 'name', None)
# create a new XML file with the results
mytree.write( 'output5.xml')
Output:
上图展现 name 属性已从 item 标识表记标帜中删除。要删除完全的标签,能够利用不异的 pop 办法,如下所示:
myroot[ 0].remove(myroot[ 0][ 0])
mytree.write( 'output6.xml')
Output:
输出展现食物标签的第一个子元素已被删除。假设要删除所有标签,能够利用 clear 函数,如下所示:
myroot[ 0].clear
mytree.write( 'output7.xml')
施行上述代码时, food 标签的第一个子标签将被完全删除,包罗所有子标签。
到目前为行,我们不断在利用 Python XML 解析器中的 xml.etree.ElementTree 模块。如今让我们看看若何利用 Minidom 解析 XML。
xml.dom.minidom Module
该模块根本上是由熟知DOM(文档对象模块)的人利用的,DOM 利用法式凡是起首将 XML 解析为 DOM。在 xml.dom.minidom 中,能够通过以下体例实现
利用 parse 函数:
第一种办法是通过供给要解析的 XML 文件做为参数来利用 parse 函数。例如:
fromxml.dom importminidom
p1 = minidom.parse( "sample.xml")
施行此操做后,将可以拆分 XML 文件并获取所需的数据。还能够利用此函数解析翻开的文件。
dat=open( 'sample.xml')
p2=minidom.parse(dat)
在那种情状下,存储翻开文件的变量做为参数提赐与 parse 函数。
利用 parseString 办法:
当我们想要供给要做为字符串解析的 XML 时利用此办法。
p3 = minidom.parseString( 'myxmlUsingempty/ parseString/myxml')
能够利用上述任何办法解析 XML,如今让我们测验考试利用那个模块获取数据
觅觅感兴致的元素
在我的文件被解析后,假设我们测验考试打印它,返回的输出会展现一条动静,即存储解析数据的变量是 DOM 的对象。
dat=minidom.parse( 'sample.xml')
print(dat)
Output:
xml.dom.minidom.Document object at 0x03B5A308
利用 GetElementsByTagName 拜候元素tagname= dat.getElementsByTagName( 'item')[ 0]
print(tagname)
假设我们测验考试利用 GetElementByTagName 办法获取第一个元素,我将看到以下输出:
DOM Element: item at 0xc6bd00
请重视,只返回了一个输出,因为为便利起见,那里利用了 [0] 下标,那将在进一步的示例中被删除。
要拜候属性的值,我们将不能不利用 value 属性,如下所示:
dat = minidom.parse( 'sample.xml')
tagname= dat.getElementsByTagName( 'item')
print(tagname[ 0].attributes[ 'name'].value)
Output:
breakfast
要检索那些标签中存在的数据,能够利用 data 属性,如下所示:
print(tagname[ 1].firstChild.data)
Output:
Paper Dosa
还能够利用 value 属性拆分和检索属性的值。
print(items[ 1].attributes[ 'name'].value)
Output:
breakfast
要打印出我们菜单中的所有可用项目,能够遍历那些项目并返回所有项目。
forx initems:
print(x.firstChild.data)
Output:
Idly
Paper Dosa
Upma
Bisi Bele Bath
Kesari Bath
要计算我们菜单上的项目数,能够利用 len 函数,如下所示:
print(len(items))
Output:
5
输出指定我们的菜单包罗 5 个项目。
进门: 最全的零根底学Python的问题 | 零根底学了8个月的Python |实战项目 | 学Python就是那条捷径
干货:爬取豆瓣短评,片子《后来的我们》 | 38年NBA更佳球员阐发 |从万寡等待到口碑扑街!唐探3令人失看 | 笑看新倚天屠龙记 | 灯谜答题王 | 用Python做个海量蜜斯姐素描图 | 碟中谍那么火,我用机器进修做个迷你选举系统片子
兴趣:弹球游戏 | 九宫格 | 标致的花 | 两百行Python《天天酷跑》游戏!
AI:会做诗的机器人 | 给图片上色 | 揣测收进 | 碟中谍那么火,我用机器进修做个迷你选举系统片子
小东西: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保留为pdf! |再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 造造一款钉钉低价机票提醒器! |60行代码做了一个语音壁纸切换器天天看蜜斯姐! |
年度爆款案牍
1). 卧槽!Pdf转Word用Python轻松搞定 !
2).学Python实香!我用100行代码做了个网站,帮人PS游览图片,赚个鸡腿食
3).首播过亿,火爆全网,我阐发了《披荆斩棘的姐姐》,发现了那些奥秘
4). 80行代码!用Python做一个哆来A梦分身
5).你必需掌握的20个python代码,短小精悍,用途无限
6). 30个Python奇淫身手集
7). 我总结的80页《菜鸟学Python精选干货.pdf》,都是干货
8). 再见Python!我要学Go了!2500字深度阐发 !
9).发现一个舔狗福利!那个Python爬虫神器太爽了,主动下载妹子图片