xml.etree.ElementTree 簡介

xml.etree.ElementTree 是一個用于處理樹結(jié)構(gòu)的 Python 包轮听。

它可以用于處理任何樹結(jié)構(gòu)的數(shù)據(jù),但最常用于處理 XML 文檔杯拐。

參考文檔:http://effbot.org/zone/element.htm

Element類

from xml.etree.ElementTree import Element

Element類代表了樹節(jié)點霞篡,每個樹節(jié)點包含以下成員(properties):

類成員 類型 如何獲取
節(jié)點名(tag) str Element.tag
屬性(attributes) dict Element.attrib
文本(text) str Element.text
附加文本(tail) str Element.tail
子節(jié)點列表 list Element[:]

創(chuàng)建樹節(jié)點

創(chuàng)建樹節(jié)點時,一定要指定節(jié)點名:

tree_node = Element("node1")
print(tree_node.tag)    # 輸出 node1
print(tree_node.text)   # 輸出 None
print(tree_node.tail)   # 輸出 None
print(tree_node.attrib) # 輸出 {}

也可在創(chuàng)建時指定屬性(Element.attrib):

tree_node = Element("node2", {"attr1": 1, "attr2": 2})
print(tree_node.tag)    # 輸出 node2
print(tree_node.text)   # 輸出 None
print(tree_node.tail)   # 輸出 None
print(tree_node.attrib) # 輸出 {'attr1': 1, 'attr2': 2}

設(shè)置文本(Element.text)或附加文本(Element.tail)

創(chuàng)建節(jié)點后凸郑,可以設(shè)置 text, tail 等類成員。這些成員的初始值為 None矛市。

tree_node = Element("node1")
tree_node.text = "Hello world"
tree_node.tail = "Bye"

添加子節(jié)點

可以用 Element.append() 成員函數(shù)添加子節(jié)點:

root = Element("root")
child1 = Element("child1")
child2 = Element("child2")

root.append(child1)
root.append(child2)

訪問子節(jié)點

Element類用私有成員 Element._children 存放子節(jié)點芙沥,該私有成員是一個 list 變量。

為了方便訪問子節(jié)點浊吏,Element封裝了下標(biāo)索引函數(shù),使用時可以把 Element 想象成一個 list
變量:

  • len(Element) 檢查子節(jié)點個數(shù)
  • Element[0] 訪問第0個子節(jié)點找田,Element[1] 訪問第1個子節(jié)點...
  • for child in Element 遍歷所有子節(jié)點
  • Element.remove(child) 刪除某個子節(jié)點
root = Element("root")
child1 = Element("child1")
child2 = Element("child2")

root.append(child1)
root.append(child2)

print(len(root))    # 2
print(root[0].tag)  # child1
root.remove(child1)
print(len(root))    # 1

樹結(jié)構(gòu)與 XML 字符串的相互轉(zhuǎn)換

使用 xml.etree.ElementTree 包中的 tostring()fromstring() 函數(shù):

from xml.etree.ElementTree import Element, tostring, fromstring

root = Element("root")
child1 = Element("child1")
child2 = Element("child2")
root.append(child1)
root.append(child2)

tree_str = tostring(root, encoding="unicode")
print(tree_str)
# '<root><child1 /><child2 /></root>''

new_root = fromstring(tree_str)
print(new_root.tag, new_root[0].tag, new_root[1].tag)
# root child1 child2

如果 tostring() 參數(shù)不指定 encoding="unicode"墩衙,函數(shù)將返回 byte 序列务嫡。

再舉一個生成 html 的例子:

from xml.etree.ElementTree import Element, tostring

html = Element("html")

head = Element("head")
html.append(head)

title = Element("title")
title.text = "HTML Example"
head.append(title)

body = Element("body")
body.text = "Hello world"
html.append(body)

html_str = tostring(html, encoding="unicode")
print(html_str)
# <html><head><title>HTML Example</title></head><body>Hello world</body></html>

快捷操作

添加子節(jié)點可以用 SubElement 構(gòu)造函數(shù)快速實現(xiàn):

from xml.etree.ElementTree import Element, SubElement

root = Element("root")
child = Element("child")
root.append(child)

# 等價于

root = Element("root")
child = SubElement(root, "child")
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末心铃,一起剝皮案震驚了整個濱河市挫剑,隨后出現(xiàn)的幾起案子去扣,更是在濱河造成了極大的恐慌樊破,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奔滑,死亡現(xiàn)場離奇詭異顺少,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)祈纯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門腕窥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人簇爆,你說我怎么就攤上這事∪肭” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵枫甲,是天一觀的道長扼褪。 經(jīng)常有香客問我想幻,道長话浇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任食店,我火速辦了婚禮赏寇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蹋订。我一直安慰自己,他們只是感情好露戒,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著动漾,像睡著了一般荠锭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上证九,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機(jī)與錄音呀页,去河邊找鬼拥坛。 笑死蓬蝶,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的培愁。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼定续,長吁一口氣:“原來是場噩夢啊……” “哼雹洗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起时肿,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤螃成,失蹤者是張志新(化名)和其女友劉穎旦签,沒想到半個月后寸宏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡羔巢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年罩阵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稿壁。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡傅是,死狀恐怖匪燕,靈堂內(nèi)的尸體忽然破棺而出喧笔,到底是詐尸還是另有隱情,我是刑警寧澤书闸,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布梗劫,位于F島的核電站享甸,受9級特大地震影響梳侨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜走哺,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一丙躏、第九天 我趴在偏房一處隱蔽的房頂上張望择示。 院中可真熱鬧晒旅,春花似錦、人聲如沸废恋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽迄本。三九已至硕淑,卻和暖如春嘉赎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背曹阔。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工赃份, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留寂拆,地道東北人抓韩。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像尝江,于是被迫代替她去往敵國和親英上。 傳聞我的和親對象是個殘疾皇子炭序,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容

  • 第3章 基本概念 3.1 語法 3.2 關(guān)鍵字和保留字 3.3 變量 3.4 數(shù)據(jù)類型 5種簡單數(shù)據(jù)類型:Unde...
    RickCole閱讀 5,106評論 0 21
  • 人生苦短惭聂,我用Python。 起初辜纲,這篇文章是打算來寫 XPath 的,可是后來一想耕腾,我需要的僅是 XPath 的...
    Moscow1147閱讀 20,738評論 1 14
  • 寫在前面的話 代碼中的# > 表示的是輸出結(jié)果 輸入 使用input()函數(shù) 用法 注意input函數(shù)輸出的均是字...
    FlyingLittlePG閱讀 2,743評論 0 8
  • 本主題主要說明python的xml處理標(biāo)準(zhǔn)模塊xml.etree的使用扫俺。xml.etree模塊包含4個子模塊,其中...
    楊強(qiáng)AT南京閱讀 7,158評論 0 5
  • 問題1:有一個XML文件柒啤,如何解析問題2:解析后,如果查找担巩、定位某個標(biāo)簽問題3:定位后如何操作標(biāo)簽没炒,比如訪問屬性涛癌、...
    野狗子嗷嗷嗷閱讀 14,159評論 0 7