0

0

Python lxml etree.fromstring parser 指定解析器参数

煙雲

煙雲

发布时间:2026-03-02 11:30:11

|

280人浏览过

|

来源于php中文网

原创

etree.fromstring 默认使用 etree.xmlparser,不带任何预设参数,遇 malformed xml 直接抛 xmlsyntaxerror,不自动处理 encoding 声明,也不忽略空白或注释。

python lxml etree.fromstring parser 指定解析器参数

etree.fromstring 默认用什么 parser?

默认用 etree.XMLParser,不是 etree.HTMLParser,也不带任何预设参数。这意味着:遇到 malformed XML(比如未闭合标签、非法字符、编码声明不一致)会直接抛 XMLSyntaxError;不自动处理 encoding 声明;不忽略空白或注释——除非你显式配置。

常见错误现象:UnicodeDecodeError: 'ascii' codec can't decode byte(源字符串是 bytes 但含非 ASCII)、XMLSyntaxError: Document is empty(空字符串或纯空白)、XMLSyntaxError: Invalid character in attribute value(如属性里有未转义的 &)。

实操建议:

  • 如果输入是 bytes,确保它和 XML 声明中的 encoding 一致(例如 <?xml version="1.0" encoding="utf-8"?>),否则 parser 可能按系统默认编码(如 cp1252)误读
  • 若不确定输入是否规范,别直接 fromstring(data),先用 etree.XMLParser(recover=True)
  • recover=True 不等于“容错 HTML 解析”,它只对 XML 语法错误做尽力恢复(比如补闭合标签),但不会把 <div> 当合法元素——那是 <code>HTMLParser 的事

    recover=True 能解决哪些问题?又不能解决什么?

    它让 parser 在遇到严重语法错误时不抛异常,而是尝试构建一个尽可能完整的树。典型适用场景:抓取网页返回的“类 XML”片段(实际是混杂 HTML 的 XML 片段)、日志中截断的 XML、遗留系统输出的格式松散数据。

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

    但要注意:

    凡科AI抠图
    凡科AI抠图

    简单好用的在线抠图工具

    下载
    • recover=True 对编码错误无效——UnicodeDecodeError 仍会抛出,必须提前 decode 或传入正确编码的 bytes
    • 它不会修复命名空间声明缺失导致的 Prefix not found 错误
    • 如果 XML 中有 引用外部 DTD,且网络不可达或 DTD 格式非法,<code>recover=True 也救不了——需加 resolve_entities=False
    • 性能略降(parser 需多轮试探),生产环境高频解析时建议只在必要时开启

    怎么安全地传入 encoding 参数?

    etree.fromstring() 本身没有 encoding 参数。真正控制编码的是 parser 实例——通过 etree.XMLParser(encoding=...) 构造,再传给 fromstring(data, parser=...)

    常见误区:

    • 把 UTF-8 编码的 bytes 误当 str 传入:Python 3 下 fromstring(b"<root></root>", parser=p) 是 OK 的,但 fromstring("<root></root>", parser=p) 中 parser 的 encoding 参数会被忽略(因为 str 已解码)
    • parser 的 encoding 和 XML 声明冲突时,lxml 优先信声明(除非设 resolve_entities=False 且声明非法)
    • Windows 上读文件常默认用 open(..., encoding="gbk"),结果把 UTF-8 文件当 GBK 解码成乱码 str,再喂给 fromstring——这时 parser 的 encoding 完全不起作用

    实操建议:统一用 bytes + 显式 XMLParser(encoding="utf-8"),避免隐式解码干扰。

    HTML 片段该不该用 fromstring + XMLParser?

    不该。哪怕片段看着像 XML(比如 <p><b>text</b></p>),只要它来自 HTML 上下文(无根元素、含自闭合标签如 <br>、有 <script></script> 内 CDATA),XMLParser 就会失败或行为异常。

    正确做法:

    • etree.HTMLParser() 替代 XMLParser()
    • 对应调用 etree.fromstring(html_bytes, parser=etree.HTMLParser()) 或更稳妥的 etree.parse(io.BytesIO(html_bytes), etree.HTMLParser())
    • HTMLParser 默认 recover=True,且自动处理编码、script/style 内容、布尔属性(<input checked>)等
    • 注意:HTMLParser 返回的树可能和原始 HTML 结构不完全一致(比如自动补 ),提取时得适配

    最易被忽略的一点:同一个 parser 实例不能复用于不同编码的输入——parser 的 encoding 是构造时绑定的,换数据就得换 parser,否则可能静默错解。

热门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)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1938

2024.04.01

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

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

2116

2024.08.01

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

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

1142

2024.11.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

658

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1560

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

645

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1108

2024.03.22

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

45

2026.02.28

热门下载

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

精品课程

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

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.8万人学习

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

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