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

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")—— 这是私有方法,且同样触发语法解析失败 - 更别用
exec或eval拼字符串——既危险又没必要
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 场景都认它,不是临时补丁。