教你用python轻松解析XML和PDF,一文够了,赶紧码住

用python轻轻松松解析XML和PDF

  • Python 解析 XML
    • XML的诞生
    • 解析
      • 解析方式
      • 具体实现
        • DOM 方式解析
        • SAX 方式解析
        • ElementTree 方式解析
  • Python 解析 PDF
    • 安装 PDFMiner
    • 解析概述
    • 基本用法
    • 解析对象
  • 参考
Python 解析 XMLXML的诞生XML 全称 Extensible Markup Language , 中文译为可扩展标记语言 。
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 使用也很方便 。
具体实现在具体解析之前我们先准备一个 XML , 命名为test.xml , 如下所示:
1001张三丰221002李牛花25DOM 方式解析使用 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)输出结果:
教你用python轻松解析XML和PDF,一文够了,赶紧码住文章插图
通过输出结果 , 我们可以发现已经获取了标签属性值和标签内容了 。
SAX 方式解析使用 SAX 解析 XML 文档主要涉及到解析器和事件处理器 。
  • 解析器负责读取 XML 文档 , 并向事件处理器发送事件
  • 事件处理器负责对事件作出响应 , 对传递的 XML 数据进行处理 。
Python 使用 SAX 处理 XML 需要用到 xml.sax 中的 parse 函数和 xml.sax.handler 中的 ContentHandler 类 , 下面看一下 ContentHandler 类中的一些方法 。
  • characters(content):调用时机:从行开始 , 遇到标签之前 , 存在字符 , content 的值为这些字符串;从一个标签 , 遇到下一个标签之前 ,存在字符 , content 的值为这些字符串;从一个标签 , 遇到行结束符之前 , 存在字符 , content 的值为这些字符串 。
  • startDocument():文档启动的时候调用 。
  • endDocument():解析器到达文档结尾时调用 。
  • startElement(name, attrs):遇到 XML 开始标签时调用 , name 是标签的名字 , attrs 是标签的属性值字典 。
  • endElement(name):遇到 XML 结束标签时调用 。
下面通过示例看一下如何通过 SAX 方式解析 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")