使用lxml处理XML时如何不借助for循环批量删除多个同名子节点
报错原因和解决方案
你遇到的报错是因为lxml.etree._Element的remove()方法仅支持传入单个Element对象作为参数,无法直接接收节点列表。
无需显式for循环的解决方案
方法1:使用lxml内置批量删除方法etree.strip_elements(最推荐)
这是lxml原生提供的批量删除指定标签子节点的方法,无需自己处理循环逻辑,一行即可完成:
import lxml.etree as etree # 已获取malay_node的前提下,直接删除该节点下所有的holidays子节点 etree.strip_elements(malay_node, 'holidays', with_tail=False)
参数说明:
- 第一个参数是父节点,指定仅删除该节点下的对应标签
- 第二个参数是要删除的标签名
with_tail=False避免误删holidays节点尾部附带的文本内容,无额外文本时也可省略
如果holidays节点带命名空间,建议使用下面的方法2,避免标签名匹配失败。
方法2:基于已有节点列表用map隐式执行删除
如果你已经提前查到了要删除的节点列表,可以用map方法隐式遍历执行删除,不需要写显式for循环:
# 建议先把xpath查询范围限定在malay节点下,避免误删其他位置的holidays节点 malay_holiday_nodes = malay_node.xpath('.//*[local-name()="holidays"]') list(map(malay_node.remove, malay_holiday_nodes))
注意:你提供的示例XML存在标签拼写错误,开始标签为
<maylay>,闭合标签为</malay>,解析前请修正为一致的拼写,否则会触发XML语法错误。
内容的提问来源于stack exchange,提问作者Tristan Tran
相关产品推荐
相关产品推荐

