【问题标题】:How do I iterate through ElementTree and delete all <mark> tags?如何遍历 ElementTree 并删除所有 <mark> 标签?
【发布时间】:2015-11-30 16:24:40
【问题描述】:

所以我有一个大的 xml 文件,其中包含我正在解析的数据。下面是一个例子:

<statement>
<plist>
<p>Hello Stack Overflow.</p>
<p>This doesn't <mark type="NA" /> seem to work!</p>
</plist>
</statement>

我开发的程序只返回“Hello Stack Overflow。这不会” 为了解析该行的其余部分,我想在解析之前删除标记标签。使用 root.findall('.//mark') 函数我能够找到标记,但是 root.remove(marks) 在循环 findall 函数的返回时不起作用,因为从根到这些标记的路径是未知的.我还尝试找到 p 标签的所有实例并在它们中搜索标记标签,然后使用“p tag”.remove(“mark tag”) 删除它们,这并没有失败,但似乎也没有工作。有什么建议吗?

这不是需要 lxml 导入的任何内容的重复,因为这可能没有依赖关系,并且必须仅使用元素树功能来解决。

【问题讨论】:

  • 要移除一个元素,你显然需要知道元素的parent。您是否查看过 ElementTree 元素上可用的方法?
  • 是的,没有直接访问父节点的方法。但正如我之前所说,所有标记标签都位于由 p 标签包围的文本中。因此,通过遍历所有 p 标记并检查是否包含“标记”,我可以找到父节点(p 标记)并使用它来删除标记标记。但是,在我完成此操作并尝试解析文本后,文本仍会在标记标记所在的位置(或仍然是)处截断。所以我有点茫然。
  • 直接访问父节点的方法。
  • 怎么样?我阅读的所有文档似乎都指定您无法设计。

标签: python xml xml-parsing elementtree


【解决方案1】:

ElementTree 将 之前的文本解析为包含 p 标签的 'text' 属性,并将其之后的文本解析为 mark 标签的 'tail' 属性。

解决办法是找到p标签,在里面寻找mark标签,在删除之前,把它的尾部值附加到包含p的文本中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 2018-08-22
    • 2014-01-12
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多