Python lxml builder E.class 避免关键字冲突的写法

5次阅读

e[“class”]是唯一合法写法,因class为python关键字;生成含关键字标签须用字符串键访问,属性则用klass参数。

Python lxml builder E.class 避免关键字冲突的写法

lxml.builder.E.class 为什么报 SyntaxError

因为 class 是 Python 关键字,直接写 E.class 会语法错误——这不是 lxml 的限制,是 Python 解析器拦下来的。

常见错误现象:SyntaxError: invalid syntax,光标停在 .class 上;用 ide 写到一半就标红;复制别人代码却跑不起来。

  • 不能写 E.class("text"),哪怕你只是想生成 <class>text</class>
  • 也不能用点号链式调用绕过,比如 E.class_E.Class 都无效——E 对象只认合法的 Python 标识符作为属性名
  • 真正起作用的是字符串键访问方式:E["class"]("text")

用 E[“xxx”] 替代 E.xxx 是唯一可靠解法

lxml.builder.E 支持通过字典式取键(E["tagname"])创建任意标签,包括含关键字、带连字符、以数字开头的名称。

使用场景:生成 HTML 中的 <class></class><for></for>,或 XML 中自定义的 <xml:lang></xml:lang> 等。

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

  • E["class"]("value")<class>value</class>
  • E["for"]("label")<for>label</for>
  • E["xml:lang"]("en")<xml:lang>en</xml:lang>
  • 嵌套也一样:E.div(E["class"]("btn"), "Click me")

别误用 getattr 或 setattr 模拟点号调用

有人试过 getattr(E, "class")setattr(E, "class", ...),这没用——E 不是普通对象,它的属性访问被重载为标签构造逻辑,但关键字名根本进不了 getattr 流程。

性能与兼容性影响:字符串键访问 E["class"]E.div 底层走的是同一套逻辑,无额外开销,PyPy/CPython 行为一致。

  • 不要写 getattr(E, "class") —— 报 AttributeError
  • 不要写 E.__getattr__("class") —— 这是私有方法,且同样触发语法解析失败
  • 更别用 execeval 拼字符串——既危险又没必要

HTML 属性里 class 怎么办?不是标签名

如果目标是给元素加 class 属性(比如 <div class="btn">),那根本不用动 <code>E,直接传 keyword 参数:

  • E.div("content", klass="btn")<div class="btn">content</div>
  • E.span("text", klass="bold", id="s1")<span class="bold" id="s1">text</span>
  • 注意:必须用 klass,不是 class,这是 lxml 的约定,避免关键字冲突

这个 klass 是 lxml 特有的别名,所有 builder 场景都认它,不是临时补丁。

text=ZqhQzanResources