新聞中心
Python標(biāo)準(zhǔn)庫(kù)系列之xml模塊
Python’s interfaces for processing XML are grouped in the xml package.
帶分隔符的文件僅有兩維的數(shù)據(jù):行和列。如果你想在程序之間交換數(shù)據(jù)結(jié)構(gòu),需要一種方法把層次結(jié)構(gòu)、序列、集合和其他的結(jié)構(gòu)編碼成文本。
XML
是最突出的處理這種轉(zhuǎn)換的標(biāo)記(markup)格式,它使用標(biāo)簽(tag)分個(gè)數(shù)據(jù),如下面的實(shí)例文件menu.xml所示:
安生's Blog 大好時(shí)光! 2016-05-24T15:29:19.000Z 安生
XML的一些重要特性
標(biāo)簽以一個(gè)
<
字符開頭,例如實(shí)例中的feed、title、subtitle、author。忽略空格
通常一個(gè)開始標(biāo)簽跟一段其他的內(nèi)容,然后是最后相匹配的結(jié)束標(biāo)簽,例如
大好時(shí)光!標(biāo)簽之間是可以存在多級(jí)嵌套的
可選屬性(attribute)可以出現(xiàn)在開始標(biāo)簽里
標(biāo)簽中可以包含值(value)
如果一個(gè)命名為
thing
的標(biāo)簽內(nèi)沒有內(nèi)容或者子標(biāo)簽,那么它可以用在右尖括號(hào)的前面添加斜杠的簡(jiǎn)單標(biāo)簽所表示,例如代替開始和結(jié)束都存在的標(biāo)簽。
存放數(shù)據(jù)的位置可以是任意的—-屬性、值或者子標(biāo)簽。
XML通常用于數(shù)據(jù)傳送和消息,它存在一些子格式,如RSS和Atom,例如:https://blog.ansheng.me/atom.xml
在Python中解析XML最簡(jiǎn)單的方法是使用ElementTree
。
模塊 | 說(shuō)明 |
---|---|
xml.etree.ElementTree | the ElementTree API, a simple and lightweight XML processor |
創(chuàng)建xml文件
導(dǎo)入ElementTree方法,起一個(gè)別名為ET
>>> from xml.etree import ElementTree as ET
創(chuàng)建頂級(jí)標(biāo)簽
>>> level_1 = ET.Element("famliy")
創(chuàng)建二級(jí)標(biāo)簽,tag名name,attrib標(biāo)簽屬性
>>> level_2 = ET.SubElement(level_1, "name", attrib={"enrolled":"yes"})
創(chuàng)建三級(jí)標(biāo)簽
>>> level_3 = ET.SubElement(level_2, "age", attrib={"checked":"no"})
生成文檔
>>> tree = ET.ElementTree(level_1)
寫入文件中
>>> tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False)
導(dǎo)入os模塊,用os模塊中的system方法執(zhí)行shell命令查看剛才創(chuàng)建的oooo.xml文件
>>> import os >>> os.system("cat oooo.xml") # 生成出來(lái)的文檔是沒有換行的0
把剛才生成的文件下載到本地,然后用瀏覽器打開就可以看到分級(jí)層次了。
創(chuàng)建一個(gè)有換行的XML文件
代碼
from xml.etree import ElementTree as ET from xml.dom import minidom root = ET.Element('level1',{"age":"1"}) son = ET.SubElement(root,"level2",{"age":"2"}) ET.SubElement(son, "level3", {"age":"3"}) # tree = ET.ElementTree(root) # tree.write("abc.xml", encoding="utf-8",xml_declaration=True,short_empty_elements=False) def prettify(root): rough_string = ET.tostring(root, 'utf-8') reparsed = minidom.parseString(rough_string) return reparsed.toprettyxml(indent="\t") new_str = prettify(root) f = open("new_out.xml", "w") f.write(new_str) f.close()
生成的xml文件
解析XML
first.xml
文件內(nèi)容為:
2 2025 141100 5 2028 59900 69 2028 13600
first.xml
文件在/root
目錄下
利用ElementTree.XML將字符串解析成xml對(duì)象
>>> from xml.etree import ElementTree as ET # 打開文件,讀取XML內(nèi)容,將字符串解析成xml特殊對(duì)象,root代指xml文件的根節(jié)點(diǎn) >>> root = ET.XML(open('first.xml', 'r').read()) >>> root.tag 'data' >>> for node in root: ... print(node.tag, node.attrib) ... ('country', {'name': 'Liechtenstein'}) ('country', {'name': 'Singapore'}) ('country', {'name': 'Panama'}) >>> print(node.find('rank').text) 69
利用ElementTree.parse將文件直接解析成xml對(duì)象
>>> from xml.etree import ElementTree as ET # 直接解析xml文件 >>> tree = ET.parse("first.xml") # 獲取xml文件的根節(jié)點(diǎn) >>> root = tree.getroot() >>> root.tag 'data'
遍歷XML中指定的節(jié)點(diǎn)
>>> from xml.etree import ElementTree as ET >>> tree = ET.parse("first.xml") >>> root = tree.getroot() >>> for node in root.iter('year'): # 輸出node的tag和內(nèi)容 ... print(node.tag, node.text) ... year 2025 year 2028 year 2028
增、刪、改XML
為節(jié)點(diǎn)添加屬性
>>> from xml.etree import ElementTree as ET >>> tree = ET.parse("first.xml") >>> root = tree.getroot() >>> for node in root.iter("year"): # 查看原來(lái)的屬性 ... print(node.attrib) ... {} {} {} >>> for node in root.iter("year"): # 添加屬性 ... node.set("OS","Linux") ... >>> for node in root.iter("year"): # 查看添加的屬性 ... print(node.attrib) ... {'OS': 'Linux'} {'OS': 'Linux'} {'OS': 'Linux'} # 把內(nèi)容寫入文件 >>> tree.write("first.xml")
刪除節(jié)點(diǎn)屬性
>>> from xml.etree import ElementTree as ET >>> tree = ET.parse("first.xml") >>> root = tree.getroot() >>> for node in root.iter("year"): # 刪除節(jié)點(diǎn)的OS屬性 ... del node.attrib['OS'] ... # 寫入到文件當(dāng)中 >>> tree.write("first.xml")
查看屬性
>>> from xml.etree import ElementTree as ET >>> tree = ET.parse("first.xml") >>> root = tree.getroot() >>> for node in root.iter("year"): ... print(node.attrib) ... # 節(jié)點(diǎn)內(nèi)容為空 {} {} {}
修改節(jié)點(diǎn)內(nèi)容
修改year
內(nèi)的數(shù)字自加1
>>> from xml.etree import ElementTree as ET >>> tree = ET.parse("first.xml") >>> root = tree.getroot() >>> for node in root.iter("year"): # 輸出原來(lái)year的內(nèi)容 ... print(node.text) # 原來(lái)的值自加+ ... new_year = int(node.text) + 1 ... node.text = str(new_year) ... 2025 2028 2028 # 寫入文件中 >>> tree.write("first.xml") >>> for node in root.iter("year"): # 輸出寫入文件之后year的內(nèi)容 ... print(node.text) ... 2026 2029 2029
對(duì)節(jié)點(diǎn)操作的方法
獲取節(jié)點(diǎn)的方法
>>> from xml.etree import ElementTree as ET >>> tree = ET.parse("first.xml") >>> root = tree.getroot() >>> print(dir(root)) ['__class__', '__copy__', '__deepcopy__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getstate__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'extend', 'find', 'findall', 'findtext', 'get', 'getchildren', 'getiterator', 'insert', 'items', 'iter', 'iterfind', 'itertext', 'keys', 'makeelement', 'remove', 'set']
方法有這么多,那么我們常用的也就是下面的幾個(gè)
方法名 | 說(shuō)明 |
---|---|
tag | 獲取tag標(biāo)簽名 |
attrib | 獲取節(jié)點(diǎn)的屬性 |
find | 獲取節(jié)點(diǎn)的內(nèi)容 |
iter | 進(jìn)行迭代 |
set | 設(shè)置屬性 |
get | 獲取屬性 |
實(shí)例
判斷QQ是否在線
騰訊提供了能夠查看QQ號(hào)碼是否在線的API,Y
=在線;N
=離線;E
=QQ號(hào)碼錯(cuò)誤;A
=商業(yè)用戶驗(yàn)證失敗;V
=免費(fèi)用戶超過(guò)數(shù)量
>>> import requests >>> from xml.etree import ElementTree as ET >>> r = requests.get("http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=6087414") >>> result = r.text >>> from xml.etree import ElementTree as ET >>> node = ET.XML(result) >>> if node.text == "Y": ... print("在線") ... else: ... print("離線") ... 在線
獲取列車起止時(shí)間
代碼
r = requests.get("http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=K234&UserID=") result = r.text root = ET.XML(result) for node in root.iter('TrainDetailInfo'): print(node.find('TrainStation').text,node.find('ArriveTime').text,node.find("StartTime").text)
執(zhí)行結(jié)果
C:\Python35\python.exe F:/Python_code/sublime/Week5/Day01/xml_mod.py 上海(車次:K234\K235) None 11:12:00 # 地點(diǎn) 停止 啟動(dòng) 昆山 11:45:00 11:48:00 蘇州 12:12:00 12:16:00 無(wú)錫 12:44:00 12:55:00 常州 13:22:00 13:26:00 鎮(zhèn)江 14:13:00 14:16:00 南京 15:04:00 15:16:00 蚌埠 17:27:00 17:50:00 徐州 19:38:00 19:58:00 商丘 22:12:00 22:17:00 開封 23:49:00 23:53:00 鄭州 00:37:00 01:14:00 新鄉(xiāng) 02:20:00 02:22:00 鶴壁 03:01:00 03:03:00 安陽(yáng) 03:33:00 03:36:00 邯鄲 04:11:00 04:16:00 邢臺(tái) 04:47:00 04:51:00 石家莊 06:05:00 None Process finished with exit code 0
#Python標(biāo)準(zhǔn)庫(kù) #Xml
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
本文標(biāo)題:標(biāo)準(zhǔn)庫(kù)系列之xml模塊-創(chuàng)新互聯(lián)
文章分享:http://ef60e0e.cn/article/cccjdi.html