如何在lxml的etree中仅打印元素的开始标签?
仅打印lxml etree Element的开始标签(调试专用)
当调试XML/HTML结构时,有时我们只需要查看Element的开始标签及属性,而非整个子树。但etree.tostring()默认会输出完整的元素树,对于复杂结构来说冗余信息太多。
问题重现
from lxml import etree elem = etree.fromstring(b'''<bbq taste="awful" smell="amazing"> <food type="hot dogs" /> <food type="hamburgers" condition="burnt" /> </bbq>''') # 默认输出完整树结构 print(etree.tostring(elem).decode())
输出:
<bbq taste="awful" smell="amazing"> <food type="hot dogs"/> <food type="hamburgers" condition="burnt"/> </bbq>
实现目标效果
我们需要只输出开始标签,类似etree.tostring(elem, open_tag_only=True)的效果,可通过自定义函数实现:
方法1:直接生成开始标签字符串
def get_open_tag(elem): # 拼接标签名 tag_str = f"<{elem.tag}" # 遍历并添加所有属性 for attr_name, attr_value in elem.items(): tag_str += f' {attr_name}="{attr_value}"' # 闭合开始标签 tag_str += ">" return tag_str # 使用示例 print(get_open_tag(elem))
输出:
<bbq taste="awful" smell="amazing">
方法2:模拟etree.tostring的调用风格
如果习惯用类似tostring的接口,可写一个带编码参数的包装函数:
def tostring_open_tag(elem, encoding='utf-8'): tag_str = f"<{elem.tag}" for attr_key, attr_val in elem.items(): tag_str += f' {attr_key}="{attr_val}"' tag_str += ">" return tag_str.encode(encoding) if encoding else tag_str # 调用方式与tostring一致 print(tostring_open_tag(elem).decode())
输出同上。
这种方式轻量直接,完全满足调试时快速查看元素标签和属性的需求。
内容的提问来源于stack exchange,提问作者NeatNit
相关产品推荐
相关产品推荐

