XML解析庫 lxml 教程 一

2021-10-25 04:02:52 字數 2800 閱讀 5960

本系列文章主要講解如何使用 python3 的 lxml 庫, 本篇和第二篇文章主要介紹element物件的介面

工廠函式

在 xml或html 中每一處尖括號代表著乙個標籤或者元素, lxml 庫為了方便操作, 封裝了element類, 通過element物件可以很方便地操作 xml 的元素

建立element物件

from lxml import etree

# 建立根元素

root = etree.element(

"root"

)# 檢視標籤名

print

("root.tag: "

, root.tag)

列印結果

root.tag:  root

新增subelement物件, 組成有層級關係的 elements

# 直接新增

"child_1"))

# 通過工廠函式

child_2 = etree.subelement(root,

"child_2"

)child_3 = etree.subelement(root,

"child_3"

)

將 elements 序列化為 xml 樹

xml_s = etree.tostring(root, pretty_print=

true

).decode(

'utf-8'

)print

("xml tree:"

, xml_s, sep=

'\n'

)

列印結果

xml tree:

>

/>

/>

/>

root

>

沒有子元素時, lxml 自動生成單標籤

這樣我們直接通過 lxml 庫建立了乙個 xml 文件

列表介面

每乙個 element 物件相當於乙個列表容器, 其內容為直接子元素, 操作方法與內建列表很相似

索引

child = root[0]

print

("root[0]:"

, child.tag)

root[0]: child_1
結果為首個新增的子元素

切片

# 切片 (僅包含 child_3)

root_slice = root[-1

:]print

("slice:"

,type

(root_slice)

)

slice:
切片的結果為內建列表

列表方法

# 查詢

idx = root.index(child)

print

("child idx:"

, idx)

# 插入

root.insert(

0, etree.element(

"child_0"))

# 附加

# 刪除

del root[-1

]# 追加 (補回 child_3)

root.extend(root_slice)

child idx: 0
在 root 起始位置新增了 child_0, 隨後刪除了 child_3, 通過 extend 在末尾補回 child_3

遍歷

for ele in root:

print

(ele.tag)

child_0

child_1

child_2

child_3

element 物件與列表有乙個細小的差別, element 列表成員之間賦值, lxml 會刪除賦值元素

root[0]

= root[-1

]for ele in root:

print

(ele.tag)

child_3

child_1

child_2

最後乙個元素的位置被刪除了, 這麼做是避免修改其中的乙個元素, 另乙個元素也會相應被修改

元素關係

父元素與相鄰元素

print

("parent:"

, root is child.getparent())

# root[1] 之前是 root[0]

print

("before:"

, root[0]

is root[1]

.getprevious())

# root[1] 之後是 root[2]

print

("after: "

, root[2]

is root[1]

.getnext(

))

列印結果

parent: true

before: true

after: true

XML解析庫 lxml 教程 二

字典介面 在 xml 或 html 中每乙個標籤都有屬性,element類通過字典介面支援屬性操作 建立帶有屬性的element物件 from lxml import etree 帶屬性的 element root etree.element root name root 序列化為 xml 標籤 r...

lxml解析xml檔案

最近在工作中需要從多個xml檔案中選出一些節點合成乙個新的xml檔案,首先想到的使用python自帶的xml.etree.elementtree模組,但是發現合併後的檔案中原來的cdata部分不對,括號和引號都被轉義了,沒有和原來保持一致,elementtree模組解決不了這個問題,我就想會不會有第...

Python 之lxml解析庫

一 xpath常用規則 二 解析html檔案 from lxml import etree 讀取html檔案進行解析 defparse html file html etree.parse test.html parser etree.htmlparser print etree.tostring ...