xml 比 json 复杂,在 web 中的应用越来越少,有些地方也会用到,我们有必要了解一下 xml。解析 xml 有两种方法:dom 和 sax。dom 会把整个 xml 读入内存,因此占用内存大,解析慢;sax 是流模式,边读边解析,占用内存小,解析快。我们本节就学习如何用 sax 来解析 xml。
我们使用 sax 解析 xml 文件,我们只需要写一个类继承 sax 模块的 ContentHandler 类即可,我们可以通过重写父类的函数,定制自己的方案。
ContentHandler 类即可,我们可以通过重写父类的函数,定制自己的方案。
from xml import sax class MyHandler(sax.ContentHandler): # 定义自己的 handler 类,继承 sax.ContentHandler def __init__(self): sax.ContentHandler.__init__(self) # 父类和子类都需要初始化(做一些变量的赋值操作等) self._content = "" self._tag = "" def startElement(self, name, attrs): # 遇到 <tag> 标签时候会执行的方法,这里的 name,attrs 不用自己传值的(这里其实是重写) self._tag = name if name == "birdpython": print("=========birdpython.com=========") if self._tag == "book": print("BOOK: " + attrs["category"]) print("--------------------------") def endElement(self, name): # 遇到</tag>执行的方法,name 不用自己传值(重写) if name == "birdpython": print("=========birdpython.com=========") elif name == "title": print("Title: " + self._content) elif name == "author": print("Author: " + self._content) elif name == "year": print("Year: " + self._content) elif name == "price": print("Price: " + self._content) else: pass def characters(self, content): # 获取标签内容 self._content = content xml = ''' <birdpython> <book category="python教程"> <title>老鸟python</title> <author>孤独的高手</author> <year>2019</year> <price>免费</price> </book> <book category="人工智能教程"> <title>老鸟python视频</title> <author>孤独的高手</author> <year>2019</year> <price>微信打赏赠送</price> </book> </birdpython> ''' handler = MyHandler() # 自定义类实例化成对象 sax.parseString(xml, handler) # 解析xml文件
现在我们一般使用 json 替代了 xml,关于 xml 结构和解析的东西,我们本节课不在赘述。
会使用 xml 中的 sax 模块。
了解一下 xml 结构。
本节课不做要求。
爬虫的时候,能用到