python技巧程序员

Python解析XML脚本

2018-07-10  本文已影响1人  陆_志东

解析方法有两种: 推荐2

1.使用xml.dom.minidom解析

2.使用xml.etree.ElementTree解析

方法一:xml.dom.minidom

python中使用xml.dom.minidom来解析XML文件

import xml.dom.minidom as xmldom
import os
""" 比如现在有包含以下xml信息的文件 test.xml
<note>
<date>
  <day>08</day>
  <month>08</month>
  <year>2008</year>
</date>
<to a="1">George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
"""
# 拿到XML文件路径
xml_file_path = os.path.abspath("./data/test.xml")

# 得到文档对象
xml_obj = xmldom.parse(xml_file_path)
print("xml对象类型:",type(xml_obj))

# 得到元素对象(文档树结构) 可省略
elementobj = xml_obj.documentElement # 根元素
print("元素对象类型:",type(elementobj))

# 获得子元素 下面两种方式是一样的效果
body = xml_obj.getElementsByTagName("body")[0].firstChild.data
body1 = elementobj.getElementsByTagName("body")[0].firstChild.data
print(body)  # Don't forget the meeting!
print(body1)  # Don't forget the meeting!

# 获得标签属性值
attr = xml_obj.getElementsByTagName("to")[0].getAttribute("a")
print(attr)   # 1

方法二:xml.etree.ElementTree

python 包 xml.etree.ElementTree 是用来处理XML对象的,比如你使用python的request包或者urllib3的http连接池PoolManager,发送一个请求,响应的是XML数据,这个时候就需要解析这个xml对象来得到我们想要的数据

import xml.etree.ElementTree as et
import os
import sys

# 打开xml文件的两种方式:1.读取xml文件 2.直接解析xml对象字符串
# 方式一: et.parse("file_path")  # 读取xml文件
file_path = os.path.abspath("./data/test.xml")
root = et.parse(file_path)
print(root.find("from").text)  # John
print(root.find("to").get("a"))  # 1

# 方式二: et.fromstring("xml_content")  # 直接解析xml对象字符串
import urllib3
urllib3.disable_warnings()  # 禁用各种urllib3的警告
http = urllib3.PoolManager(retries=2,timeout=10,num_pools=200,maxsize=200)

# 使用连接池发起一个请求
res = http.request("GET","")
if res.status == 200:
    # 使用方式二解析xml对象
    root = et.fromstring(res.data)

    # 拿到根元素
    node = root.find("note")
    # 还可以通过下标的方式访问 node = root[0]

    # 拿到 from标签
    ele_from = node.find("from")  # 如果有多个form 想拿到所有form,就使用node.findall()方法,返回一个列表

    # 拿到标签的值
    value = ele_from.text
    print(value)

    # 获取属性使用get,设置属性使用set
    a = node.find("to").get("a")
    node.find("to").set("a", 2)

上一篇 下一篇

猜你喜欢

热点阅读