核心区别在于输入来源和返回对象类型:fromstring() 从字符串解析,返回 Element 对象;parse() 从文件或类文件对象解析,返回 ElementTree 对象。

核心区别在于输入来源和返回对象类型:`fromstring()` 从字符串解析,返回 Element 对象;`parse()` 从文件或类文件对象解析,返回 ElementTree 对象。
输入来源不同
两者设计初衷就针对不同数据源:
-
fromstring(text):只接受**字符串**(如 HTML/XML 片段、响应文本response.text),适合网络请求后直接解析内容 -
parse(source):接受**文件路径字符串**(如"data.xml")或**类文件对象**(如open("file.html")、io.BytesIO(data)),适合读取本地文件或二进制流
返回对象类型不同
这直接影响后续操作能力:
-
fromstring()返回Element—— 表示 XML/HTML 文档的根节点,可查子节点、属性、文本,但不支持直接写入文件或序列化整棵树 -
parse()返回ElementTree—— 封装整个文档结构,提供.write()方法,能保存修改后的完整文档到文件或字节流
解析器行为略有差异
虽然都可传入自定义 parser= 参数,但默认行为有细节差别:
立即学习“Python免费学习笔记(深入)”;
-
fromstring()默认用etree.XMLParser()(严格 XML 模式),若解析 HTML 建议显式用etree.HTMLParser()或改用etree.HTML() -
parse()同样默认 XML 解析器,但对文件读取时会更早触发编码检测(尤其配合HTMLParser时,对乱码页面容错略好) - 若处理不规范的 HTML,
etree.HTML(text)(等价于fromstring(text, parser=HTMLParser()))比fromstring()更稳妥
什么时候该选哪个
看你的数据在哪、要做什么:
- 拿到的是
str或bytes(比如requests.get().text),且只需提取数据 → 用fromstring()或HTML() - 要读本地 .xml/.html 文件,或需保存修改后的整份文档 → 用
parse() - 需要先解析、再增删节点、最后写回磁盘 → 必须用
parse()得到ElementTree,再调用.getroot()获取根Element操作










