Python全栈之路标准库系列之xml模块

Python’s interfaces for processing XML are grouped in the xml package.

带分隔符的文件仅有两维的数据:行和列。如果你想在程序之间交换数据结构,需要一种方法把层次结构、序列、集合和其他的结构编码成文本。

XML是最突出的处理这种转换的标记(markup)格式,它使用标签(tag)分个数据,如下面的实例文件menu.xml所示:

在学习过程中有什么不懂得可以加我的
python学习交流扣扣qun,784758214
群里有不错的学习视频教程、开发工具与电子书籍。
与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>安生&#39;s Blog</title>
  <subtitle>大好时光!</subtitle>
  <link href="/atom.xml" rel="self"/>

  <link href="https://blog.ansheng.me/"/>
  <updated>2016-05-24T15:29:19.000Z</updated>
  <id>https://blog.ansheng.me/</id>

  <author>
    <name>安生</name>
  </author>
</feed>

XML的一些重要特性

  1. 标签以一个<字符开头,例如实例中的feed、title、subtitle、author。
  2. 忽略空格
  3. 通常一个开始标签跟一段其他的内容,然后是最后相匹配的结束标签,例如大好时光!
  4. 标签之间是可以存在多级嵌套的
  5. 可选属性(attribute)可以出现在开始标签里
  6. 标签中可以包含值(value)
  7. 如果一个命名为thing的标签内没有内容或者子标签,那么它可以用在右尖括号的前面添加斜杠的简单标签所表示,例如代替开始和结束都存在的标签。
  8. 存放数据的位置可以是任意的—属性、值或者子标签。

XML通常用于数据传送和消息,它存在一些子格式,如RSS和Atom,例如:https://blog.ansheng.me/atom.xml

在Python中解析XML最简单的方法是使用ElementTree

模块说明
xml.etree.ElementTreethe ElementTree API, a simple and lightweight XML processor

创建xml文件

导入ElementTree方法,起一个别名为ET

>>> from xml.etree import ElementTree as ET

创建顶级标签

>>> level_1 = ET.Element("famliy")

创建二级标签,tag名name,attrib标签属性

>>> level_2 = ET.SubElement(level_1, "name", attrib={"enrolled":"yes"}) 

创建三级标签

>>> 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)

导入os模块,用os模块中的system方法执行shell命令查看刚才创建的oooo.xml文件

>>> import os
>>> os.system("cat oooo.xml")
# 生成出来的文档是没有换行的
<famliy><name enrolled="yes"><age checked="no"></age></name></famliy>0

把刚才生成的文件下载到本地,然后用浏览器打开就可以看到分级层次了。

创建一个有换行的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 version="1.0" ?>
<level1 age="1">
    <level2 age="2">
        <level3 age="3"/>
    </level2>
</level1>

解析XML

first.xml文件内容为:

<data>
    <country name="Liechtenstein">
        <rank updated="yes">2</rank>
        <year age="19">2025</year>
        <gdppc>141100</gdppc>
        <neighbor direction="E" name="Austria" />
        <neighbor direction="W" name="Switzerland" />
    </country>
    <country name="Singapore">
        <rank updated="yes">5</rank>
        <year age="19">2028</year>
        <gdppc>59900</gdppc>
        <neighbor direction="N" name="Malaysia" />
    </country>
    <country name="Panama">
        <rank updated="yes">69</rank>
        <year age="19">2028</year>
        <gdppc>13600</gdppc>
        <neighbor direction="W" name="Costa Rica" />
        <neighbor direction="E" name="Colombia" />
    </country>
</data>

first.xml文件在/root目录下

利用ElementTree.XML将字符串解析成xml对象

>>> from xml.etree import ElementTree as ET
# 打开文件,读取XML内容,将字符串解析成xml特殊对象,root代指xml文件的根节点 
>>> 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对象

>>> from xml.etree import ElementTree as ET
# 直接解析xml文件
>>> tree = ET.parse("first.xml")
# 获取xml文件的根节点
>>> root = tree.getroot()
>>> root.tag
'data'

遍历XML中指定的节点

>>> from xml.etree import ElementTree as ET
>>> tree = ET.parse("first.xml")
>>> root = tree.getroot()
>>> for node in root.iter('year'):
        # 输出node的tag和内容
...     print(node.tag, node.text)
...
year 2025
year 2028
year 2028 

增、删、改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)
...
{}
{}
{}
>>> 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'}
# 把内容写入文件
>>> 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"):
        # 删除节点的OS属性
...     del node.attrib['OS']
...
# 写入到文件当中
>>> 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)
...
# 节点内容为空
{}
{}
{}

修改节点内容

修改year内的数字自加1

>>> from xml.etree import ElementTree as ET
>>> tree = ET.parse("first.xml")
>>> root = tree.getroot() 
>>> for node in root.iter("year"):
        # 输出原来year的内容
...     print(node.text)
        # 原来的值自加+
...     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的内容
...     print(node.text)
...
2026
2029
2029

对节点操作的方法

获取节点的方法

>>> 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']  

方法有这么多,那么我们常用的也就是下面的几个

方法名说明
tag获取tag标签名
attrib获取节点的属性
find获取节点的内容
iter进行迭代
set设置属性
get获取属性

实例

判断QQ是否在线

腾讯提供了能够查看QQ号码是否在线的API,Y=在线;N=离线;E=QQ号码错误;A=商业用户验证失败;V=免费用户超过数量

>>> 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("离线")
...
在线

获取列车起止时间

代码

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)

如果你依然在编程的世界里迷茫,可以加入我们的Python学习扣qun:784758214,看看前辈们是如何学习的!交流经验!自己是一名高级python开发工程师,从基础的python脚本到web开发、爬虫、django、数据挖掘等,零基础到项目实战的资料都有整理。送给每一位python的小伙伴!分享一些学习的方法和需要注意的小细节,点击加入我们的 python学习者聚集地

执行结果

C:\Python35\python.exe F:/Python_code/sublime/Week5/Day01/xml_mod.py
上海(车次:K234\K235) None 11:12:00
# 地点 停止    启动
昆山 11:45:00 11:48:00
苏州 12:12:00 12:16:00
无锡 12:44:00 12:55:00
常州 13:22:00 13:26:00
镇江 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
新乡 02:20:00 02:22:00
鹤壁 03:01:00 03:03:00
安阳 03:33:00 03:36:00
邯郸 04:11:00 04:16:00
邢台 04:47:00 04:51:00
石家庄 06:05:00 None

Process finished with exit code 0
<think>好的,用户现在想了解Python模块与常用库的使用,特别是常用模块和第三方库的介绍。首先,我需要回顾之前的对话历史,确保回答符合用户之前的提问和我的回答。用户之前询问了Python的异常处理机制,现在转向模块和库,这属于Python基础知识,但内容更广泛。 用户提供的引用中,引用1提到了内置模块和第三方模块基础知识,引用2和3列举了一些第三方库的例子,比如结巴分词。需要结合这些信息,但也要注意用户可能真正需要的是系统性的分类介绍,而不仅仅是列表。 首先,应该区分内置模块和第三方库,分别给出例子和用途。引用1中提到了模块的创建、导入和使用,这部分可以作为基础部分。引用2和3中的第三方库需要分类,比如数据分析、网络爬虫、机器学习等,这样用户更容易理解不同库的应用场景。 用户可能需要实际应用的例子,比如如何使用os模块进行文件操作,或者使用requests库发送HTTP请求。此外,结合之前异常处理的回答,或许可以提到在模块使用中如何处理可能出现的异常,比如导入错误,但用户这次的问题重点在介绍,可能不需要深入异常处理。 需要确保回答结构清晰,分点列出,每个模块或库给出简要说明和示例代码。同时,参考引用中的信息,例如结巴分词在引用3中被提到,应该在文本处理部分介绍。引用2中提到的数据分析库如Pandas、NumPy,可视化库如Matplotlib,这些都是必须包含的。 还要注意用户可能对如何安装第三方库有疑问,所以可能需要简要提及pip的使用,但用户的问题主要是介绍,所以可能放在最佳实践中。 最后,生成相关问题,帮助用户深入探索。例如,如何安装第三方库,或者如何选择合适的库进行项目开发。这些问题应该与模块和库的使用相关,并基于之前的回答内容。 需要检查是否有遗漏的重要模块或库,例如Flask或Django在Web开发中,或者TensorFlow在机器学习中。确保覆盖主要领域,如数据处理、网络、Web开发、机器学习等,每个领域给出1-2个例子,避免信息过载。 总结回答的结构:先介绍模块和库的概念,然后分内置模块和第三方库,每个部分按类别举例,最后给出最佳实践和常见问题。保持语言简洁,示例代码正确,并符合用户的中文要求。</think>#### Python 模块与常用库使用指南 --- ### 一、Python 模块基础 **模块**是代码复用和组织的核心单元,内置模块Python 安装包自带,第三方库需通过 `pip` 安装。 #### 1. 模块的导入方式 ```python # 导入整个模块 import os # 导入特定功能 from math import sqrt # 别名导入(常用于长模块名) import numpy as np # 动态导入(运行时判断) if condition: import json else: import simplejson as json ``` #### 2. 常用内置模块 | 模块名称 | 主要功能 | 典型应用场景 | |---------------|------------------------------------|-----------------------------| | `os` | 操作系统接口 | 文件路径操作、环境变量管理 | | `sys` | 系统参数管理 | 命令行参数解析、程序退出控制 | | `datetime` | 日期时间处理 | 时间格式化、时区转换 | | `json` | JSON 数据编码/解码 | API 数据处理、配置文件读写 | | `re` | 正则表达式操作 | 文本模式匹配、字符串清洗 | **示例:`os` 模块文件遍历** ```python import os for file in os.listdir('.'): if file.endswith('.txt'): print(f"发现文本文件: {file}") ``` --- ### 二、第三方库生态体系 Python 第三方库覆盖几乎所有技术领域,以下分类介绍核心工具链: #### 1. 数据分析与科学计算 | 库名称 | 核心功能 | 特点 | |--------------|------------------------------------|-----------------------------| | `NumPy` | 多维数组与矩阵运算 | 高性能数值计算基础库 | | `Pandas` | 结构化数据分析 | DataFrame 数据处理神器 | | `Matplotlib` | 2D 可视化 | 科研图表绘制标准工具 | | `SciPy` | 科学计算算法库 | 数值积分、优化算法等 | **示例:`Pandas` 数据清洗** ```python import pandas as pd data = pd.read_csv('data.csv') cleaned_data = data.dropna().query('value > 0') ``` #### 2. 网络爬虫与自动化 | 库名称 | 核心功能 | 应用场景 | |----------------|------------------------------------|-----------------------------| | `Requests` | HTTP 请求库 | API 调用、网页内容获取 | | `BeautifulSoup`| HTML/XML 解析 | 网页数据抽取 | | `Scrapy` | 爬虫框架 | 大规模分布式爬虫开发 | | `Selenium` | 浏览器自动化 | 动态网页渲染与交互 | **示例:`Requests` 获取网页内容** ```python import requests response = requests.get('https://api.example.com/data') print(response.json()['results']) ``` #### 3. 机器学习与 AI | 库名称 | 核心功能 | 典型应用 | |----------------|------------------------------------|-----------------------------| | `scikit-learn` | 传统机器学习算法 | 分类、回归、聚类任务 | | `TensorFlow` | 深度学习框架 | 神经网络建模与训练 | | `PyTorch` | 动态图深度学习框架 | 学术研究与复杂模型开发 | | `NLTK` | 自然语言处理工具包 | 文本分词、情感分析 | **示例:`scikit-learn` 线性回归** ```python from sklearn.linear_model import LinearRegression model = LinearRegression() model.fit(X_train, y_train) predictions = model.predict(X_test) ``` #### 4. Web 开发 | 库名称 | 角色定位 | 特点 | |----------------|------------------------------------|-----------------------------| | `Flask` | 轻量级 Web 框架 | 快速构建 REST API | | `Django` | 式 Web 框架 | 内置 ORM、Admin 等组件 | | `FastAPI` | 高性能 API 框架 | 异步支持、自动文档生成 | | `SQLAlchemy` | ORM 数据库工具 | 多数据库支持、复杂查询构建 | --- ### 三、最佳实践 1. **依赖管理** 使用 `requirements.txt` 或 `poetry` 管理库版本: ```bash # 生成依赖清单 pip freeze > requirements.txt # 安装指定版本库 pip install pandas==1.3.5 ``` 2. **虚拟环境** 通过 `venv` 隔离项目环境: ```bash python -m venv myenv source myenv/bin/activate # Linux/macOS myenv\Scripts\activate # Windows ``` 3. **异常处理** 模块导入时捕获 `ImportError`: ```python try: import tensorflow as tf except ImportError: print("请先执行: pip install tensorflow") ``` --- ### 四、模块开发建议 - **代码组织**: 将功能拆分为 `utils/`(工具函数)、`models/`(数据模型)、`services/`(业务逻辑)等子模块 - **文档规范**: 使用 docstring 说明模块功能,例如: ```python """ 数据预处理模块 包含数据清洗、特征工程等方法 """ ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值