python成长之路19——XML和requests
一、XML
XML是实现不同语言或程序之间进行数据交换的协议,XML文件格式如下:
<data name="head">我是概述 <country name="Liechtenstein"> <rank updated="yes">2</rank> <year>2023</year> </country> <country name="Singapore"> <rank updated="yes">5</rank> <year>2026</year> </country> </data>
1.解析XML
1 from xml.etree import ElementTree as ET 2 3 #解析方式一: 4 #利用ElementTree.XML将字符串解析成xml对象 5 #打开文件,读取XML内容 6 str_xml=open('s1.xml','r').read() 7 8 #将字符串解析成xml特殊对象,root代指xml文件的根节点 9 root=ET.XML(str_xml) 10 print(root) 11 12 ######################################### 13 14 #解析方式二: 15 #利用ElementTree.parse将文件直接解析成xml对象 16 tree=ET.parse('s1.xml') 17 18 #获取xml文件的根节点 19 root=tree.getroot() 20 print(root) 21 22 执行结果: 23 <Element 'data' at 0x10213db38> 24 <Element 'data' at 0x102220868>
2.操作XML
XML格式类型是节点嵌套节点,对于每一个节点均有一下功能,一边对当前节点进行操作:
1 假设节点是---node 2 3 node.tag #当前节点的标签名 4 node.attrib #当前节点的属性 5 node.text #当前节点的内容 6 7 makeelement(tag,attrib) #创建一个新节点 8 copy() #复制节点 9 append(subelement) #为当前节点追加一个子节点 10 extend(elements) #为当前节点扩展n个子节点 11 insert(index,subelement) #在当前节点的子节点中插入某个节点,即:为当前节点创建子节点,然后插入指定位置 12 remove(subelement) #删除当前节点的某个子节点 13 find(path,namespaces=None) #获取第一个寻找到的子节点 14 findtext(path,default=None,namespaces=None)#获取第一个寻找到的子节点的内容 15 findall(path,namespaces=None) #获取所有的子节点 16 iterfind(path,namespaces=None) #获取所有指定的节点,并创建一个迭代器 17 clear() #清空节点 18 get(key,default=None) #获取当前节点的属性值 19 set(key,value) #为当前节点设置属性值 20 keys() #获取当前节点所有属性的key 21 items() #获取当前节点的所有属性值,每个属性都是一个键值对 22 iter(tag=None) #当前节点的子孙中根据节点名称寻找所有指定的节点,并返回一个迭代器 23 itertext() #在当前节点的子孙中根据节点名称寻找所有指定的节点的内容,并返回一个迭代器
由于 每个节点 都具有以上的方法,并且在第一个步骤中解析时均得到了root(xml文件的根节点),so可以利用以上方法来操作xml文件。
1. 查看节点
1 from xml.etree import ElementTree as ET 2 3 #使用解析方式二获得根节点 4 tree=ET.parse('s1.xml') 5 root=tree.getroot() 6 7 #开始操作XML 8 #说明: 9 # <data name="head">我是概述 10 # <aaa> 11 # .... 12 # </aaa> 13 # </data> 14 print(root.tag) # data 15 print(root.attrib) # {'name': 'head'} 16 print(root.text) # 我是概述 17 18 for child in root: 19 print("子节点:",child.tag,child.attrib,child.text) 20 for i in child: 21 print("孙节点:",i.tag, i.attrib, i.text) 22 print("-"*20) 23 24 执行结果: 25 data 26 {'name': 'head'} 27 我是概述 28 29 子节点: country {'name': 'Liechtenstein'} 30 31 孙节点: rank {'updated': 'yes'} 2 32 孙节点: year {} 2023 33 -------------------- 34 子节点: country {'name': 'Singapore'} 35 36 孙节点: rank {'updated': 'yes'} 5 37 孙节点: year {} 2026 38 --------------------
1 from xml.etree import ElementTree as ET 2 3 #使用解析方式二获得根节点 4 tree=ET.parse('s1.xml') 5 root=tree.getroot() 6 7 #遍历XML中所有的rank节点 8 for node in root.iter('rank'): 9 print(node.tag,node.text,node.attrib) 10 11 执行结果: 12 rank 2 {'updated': 'yes'} 13 rank 5 {'updated': 'yes'}
2. 修改节点内容
由于修改节点都是在内存中进行的,其不会影响文件中的内容,所以,如果想要修改,则需要重新将内存中的内容写到文件中。