Python的lxml库是处理XML和HTML的高性能工具,其builder模块下的E-factory提供了类似函数调用的语法来构建文档节点,避免了手动拼接字符串的繁琐和潜在错误,非常适合需要动态生成结构化文档的场景。

E-factory基础使用
首先需要导入E-factory相关的模块,E是核心的工厂对象,用于创建元素节点,同时可以传入元素的属性和文本内容。
from lxml import etree
from lxml.builder import E
# 创建一个简单的div元素,带class属性,内部文本为"hello"
div_node = E.div({"class": "container"}, "hello")
# 将节点转换为字符串输出
print(etree.tostring(div_node, pretty_print=True, encoding="unicode"))
上述代码会输出格式化的HTML片段,其中<div>标签的class属性被正确设置,内部文本也正常渲染。
构建复杂嵌套结构
E-factory支持直接传入多个子节点参数,实现多层嵌套的文档结构,不需要逐层手动添加子节点。
from lxml import etree
from lxml.builder import E
# 构建一个包含标题和列表的HTML片段
html_fragment = E.div(
{"class": "article"},
E.h2("文章标题"),
E.ul(
E.li("列表项1"),
E.li("列表项2"),
E.li("列表项3")
)
)
print(etree.tostring(html_fragment, pretty_print=True, encoding="unicode"))
运行后可以看到生成的HTML结构层级清晰,所有嵌套关系都通过函数参数直接体现,代码可读性很高。
构建完整XML文档
除了HTML片段,E-factory也可以用来构建完整的XML文档,需要添加XML声明和根节点。
from lxml import etree
from lxml.builder import E
# 构建完整的XML文档
root = E.root(
E.user({"id": "1"}, E.name("张三"), E.age("25")),
E.user({"id": "2"}, E.name("李四"), E.age("30"))
)
# 创建XML树并添加声明
tree = etree.ElementTree(root)
# 设置XML声明
root.addprevious(etree.ProcessingInstruction("xml", 'version="1.0" encoding="UTF-8"'))
# 输出完整XML
print(etree.tostring(tree, pretty_print=True, encoding="unicode"))
常用操作补充
在实际使用中,还可以对生成的节点进行更多操作:
- 添加命名空间:创建元素时传入带命名空间前缀的标签名即可,比如
E.namespace:tag(attrs, text) - 修改节点内容:直接对节点的text属性或者tail属性赋值即可更新内容
- 序列化输出:使用etree.tostring时可以指定encoding参数,控制输出编码格式
需要注意的是,E-factory生成的节点本身是lxml的Element对象,因此可以使用lxml提供的所有Element操作方法,结合E-factory的简洁语法,可以灵活应对各种文档构建需求。