Python lxml的fromstring和parse有什么不同

16次阅读

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

Python lxml的fromstring和parse有什么不同

核心区别在于输入来源和返回对象类型:`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() 更稳妥

什么时候该选哪个

看你的数据在哪、要做什么:

  • 拿到的是 strbytes(比如 requests.get().text),且只需提取数据 → 用 fromstring()HTML()
  • 要读本地 .xml/.html 文件,或需保存修改后的整份文档 → 用 parse()
  • 需要先解析、再增删节点、最后写回磁盘 → 必须用 parse() 得到 ElementTree,再调用 .getroot() 获取根 Element 操作
text=ZqhQzanResources