教你用python轻松解析XML和PDF,一文够了,赶紧码住
用python轻轻松松解析XML和PDF
- Python 解析 XML
- XML的诞生
- 解析
- 解析方式
- 具体实现
- DOM 方式解析
- SAX 方式解析
- ElementTree 方式解析
- Python 解析 PDF
- 安装 PDFMiner
- 解析概述
- 基本用法
- 解析对象
- 参考
XML 之前有两个先行者:SGML 和 HTML , 率先登场的是 SGML ,尽管它功能强大 , 但文档结构复杂 , 既不容易学也不易于使用 , 因此几个主要的浏览器厂商均拒绝支持 SGML , 这些因素限制了 SGML 在网上的传播性;
1989 年 HTML 登场 , 它继承了 SGML 诸多优点 , 去除了 SGML 复杂庞大的缺点 , HTML 在数据显示上表现十分出色 , 但它的语法是不可扩展的 , 因此其无法描述数据、可读性差 , 没办法人们再次将目光转向 SGML , 经过对 SGML 一系列改造 , 终于在 1998 年 , XML 第一个版本问世 。
简单来说就是:XML 和 HTML 均由 SGML 改造而来 , HTML 是一种页面技术 , 聚焦的是数据的显示 , 而 XML 易于扩展 , 主要用来传送和存储数据 , 聚焦的是数据的内容 。
解析解析方式Python 有三种 XML 解析方式:SAX(simple API for XML)、DOM(Document Object Model)、ElementTree 。
- DOM 方式:DOM 中文译为文档对象模型 , 是 W3C 组织推荐的标准编程接口 , 它将 XML 数据在内存中解析成一个树 , 通过对树的操作来操作 XML 。
- SAX 方式:SAX 是一个用于处理 XML 事件驱动的模型 , 它逐行扫描文档 , 一边扫描一边解析 , 对于大型文档的解析拥有巨大优势 , 尽管不是 W3C 标准 , 但它却得到了广泛认可 。
- ElementTree 方式:ElementTree 相对于 DOM 来说拥有更好的性能 , 与 SAX 性能差不多 , API 使用也很方便 。
1001 张三丰 22男 1002 李牛花 25女
DOM 方式解析使用 DOM 方式 , 首先要对其 API 有一定了解 , 如果不了解 , 网上的教程也比较多 , 比如:DOM 教程 , 下面看一下使用示例 。from xml.dom.minidom import parse# 读取文件dom = parse('test.xml')# 获取文档元素对象data = http://kandian.youth.cn/index/dom.documentElement# 获取 studentstus = data.getElementsByTagName('student')for stu in stus: # 获取标签属性值st_id = stu.getAttribute('id')st_name = stu.getAttribute('name') # 获取标签中内容id = stu.getElementsByTagName('id')[0].childNodes[0].nodeValuename = stu.getElementsByTagName('name')[0].childNodes[0].nodeValueage = stu.getElementsByTagName('age')[0].childNodes[0].nodeValuegender = stu.getElementsByTagName('gender')[0].childNodes[0].nodeValueprint('st_id:', st_id,', st_name:',st_name)print('id:', id, ', name:', name, ', age:', age, ', gender:',gender)
输出结果:文章插图
通过输出结果 , 我们可以发现已经获取了标签属性值和标签内容了 。
SAX 方式解析使用 SAX 解析 XML 文档主要涉及到解析器和事件处理器 。
- 解析器负责读取 XML 文档 , 并向事件处理器发送事件
- 事件处理器负责对事件作出响应 , 对传递的 XML 数据进行处理 。
- characters(content):调用时机:从行开始 , 遇到标签之前 , 存在字符 , content 的值为这些字符串;从一个标签 , 遇到下一个标签之前 ,存在字符 , content 的值为这些字符串;从一个标签 , 遇到行结束符之前 , 存在字符 , content 的值为这些字符串 。
- startDocument():文档启动的时候调用 。
- endDocument():解析器到达文档结尾时调用 。
- startElement(name, attrs):遇到 XML 开始标签时调用 , name 是标签的名字 , attrs 是标签的属性值字典 。
- endElement(name):遇到 XML 结束标签时调用 。
import xml.saxclass StudentHandler(xml.sax.ContentHandler):def __init__(self):self.id = ""self.name = ""self.age = ""self.gender = ""# 元素开始调用def startElement(self, tag, attributes):self.CurrentData = http://kandian.youth.cn/index/tagif tag =="student":stu_name = attributes["name"]print("stu_name:", stu_name)# 元素结束调用def endElement(self, tag):if self.CurrentData =http://kandian.youth.cn/index/="id":print("id:", self.id)elif self.CurrentData =http://kandian.youth.cn/index/="name":print("name:", self.name)elif self.CurrentData =http://kandian.youth.cn/index/="age":print("age:", self.age)elif self.CurrentData =http://kandian.youth.cn/index/="gender":print("gender:", self.gender)self.CurrentDatahttp://kandian.youth.cn/index/= ""# 读取字符时调用def characters(self, content):if self.CurrentData =http://kandian.youth.cn/index/="id":self.id = contentelif self.CurrentData =http://kandian.youth.cn/index/="name":self.name = contentelif self.CurrentData =http://kandian.youth.cn/index/="age":self.age = contentelif self.CurrentData =http://kandian.youth.cn/index/="gender":self.gender = contentif (__name__ == "__main__"):# 创建 XMLReaderparser = xml.sax.make_parser()# 关闭命名空间parser.setFeature(xml.sax.handler.feature_namespaces, 0)# 重写 ContextHandlerHandler = StudentHandler()parser.setContentHandler(Handler)parser.parse("test.xml")
- 世代|Z星球——腾讯布局Z世代教育社交的新尝试
- 缩小|调整电脑屏幕文本文字显示大小,系统设置放大缩小DPI图文教程
- 路由器|家里无线网经常断网、网速慢怎么办?教你几个小窍门,轻松解决
- 教学|机器人教学的目标方案
- 走心|平安夜还在送苹果?太不走心了,教你几招,快来物色一个
- 势不可挡|清华教授刘瑜:我的女儿正势不可挡地成为一个普通人
- 云图|不会制作词云图?我来教你
- 品牌|回忆杀!夏普索爱摩托罗拉,这几个经典手机品牌你用过哪一个
- 入门|做抖音影视赚钱比工资多,教大家新手也可快速入门
- 契机|抓住人工智能助推教师发展的新契机