0

0

Python xml.sax.make_parser教程 创建SAX解析器实例

煙雲

煙雲

发布时间:2026-02-26 09:03:10

|

120人浏览过

|

来源于php中文网

原创

xml.sax.make_parser() 返回一个未配置的解析器对象,需手动设置contenthandler才能调用parse(),否则因handler为none而抛attributeerror。

python xml.sax.make_parser教程 创建sax解析器实例

xml.sax.make_parser() 返回什么,为什么不能直接 parse()?

xml.sax.make_parser() 返回的是一个解析器对象(比如 xml.sax.expatreader.ExpatParser 实例),不是“开箱即用”的解析器——它默认没注册任何内容处理器(ContentHandler)。如果你直接调 parser.parse() 而没设 setContentHandler(),会抛 AttributeError: 'NoneType' object has no attribute 'startElement'

常见错误现象:代码跑起来就报错,但看不出哪行漏了;或者解析静默完成、什么回调都没触发。

  • 必须显式创建并设置一个继承自 xml.sax.handler.ContentHandler 的类实例
  • 不能只靠 make_parser() 就认为“解析器已就绪”
  • 部分 Python 版本(如 3.9+)在未设 handler 时会抛更明确的 TypeError,但逻辑不变

怎么写一个最小可用的 ContentHandler?

你不需要实现全部方法。SAX 只在遇到对应事件时才调用对应方法,只实现你关心的即可。比如只提取所有 <title></title> 文本,只需重写 startElement()characters()endElement()

容易踩的坑:characters() 可能被多次调用(比如文本跨 CDATA 或实体),不能直接赋值,得用 += 累积;startElement()attrsxml.sax.xmlreader.AttributesImpl,支持 get()keys(),但不支持字典解包或 .items() 直接遍历(老版本会报错)。

立即学习Python免费学习笔记(深入)”;

class TitleHandler(xml.sax.handler.ContentHandler):
    def __init__(self):
        self.in_title = False
        self.title_text = ""

    def startElement(self, name, attrs):
        if name == "title":
            self.in_title = True

    def characters(self, content):
        if self.in_title:
            self.title_text += content.strip()

    def endElement(self, name):
        if name == "title":
            self.in_title = False
            print("Found title:", self.title_text)
            self.title_text = ""

解析失败时怎么定位是 XML 还是代码问题?

SAX 解析出错通常分两类:SyntaxError(XML 格式非法)和 ExpatError(底层 expat 解析器报错),后者会带行号列号,比如 xml.parsers.expat.ExpatError: not well-formed (invalid token) at line 12, column 5

SONIFY.io
SONIFY.io

设计和开发音频优先的产品和数据驱动的解决方案

下载

这时候别急着改 Python 代码——先用命令行快速验证 XML:

  • python -m xml.etree.ElementTree your_file.xml(轻量检查格式)
  • xmllint --noout your_file.xml(需安装 libxml2,更严格)
  • 注意 BOM、编码声明(<?xml version="1.0" encoding="UTF-8"?>)是否与文件实际编码一致;Python 3 默认按 UTF-8 打开,若文件是 GBK 且无声明,parse() 会直接报 UnicodeDecodeError

要不要用 make_parser()?还是直接 xml.sax.parse() 更简单?

绝大多数场景下,直接用 xml.sax.parse() 更安全、简洁。它内部自动调 make_parser() + setContentHandler(),省去手动创建解析器对象的步骤。

只有当你需要定制解析器行为时,才绕不开 make_parser(),例如:

  • 替换底层驱动(比如用 xml.sax.drivers2.drv_pyexpat,极少用)
  • 提前设置 setFeature()(如关闭命名空间处理:parser.setFeature(xml.sax.handler.feature_namespaces, 0)
  • 设置 setProperty()(如 http://xml.org/sax/properties/lexical-handler 处理注释/CDATA)

性能上没差别,但多一层对象管理就多一层出错可能。新手从 xml.sax.parse(filename, handler) 入手,等真遇到需要干预解析过程时,再回头碰 make_parser()

最常被忽略的一点:SAX 是单次流式解析,handler 实例不能复用——每次解析新文件都要新建 handler 对象,否则状态(比如 self.in_title)会残留。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1936

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2109

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1137

2024.11.28

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1936

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2109

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1137

2024.11.28

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6460

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

838

2023.09.14

batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

127

2026.02.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号