gpt4 book ai didi

Python MiniDom 无法正确删除元素

转载 作者:太空宇宙 更新时间:2023-11-03 18:00:07 29 4
gpt4 key购买 nike

我正在将一段 JS 代码转换为 Python,并且我一直在使用 mini DOM,但某些事情无法正常工作。他们在 JavaScript 中运行时正在查找。我进行转换是因为我想要一致的更改/顺序(即添加类属性的位置),并且这样我可以使用一些 Python 更简单的功能。

我遇到的最新问题是:

fonts = doc.getElementsByTagName('font')

while(fonts.length > 0):
# Create a new span
span = doc.createElement("span")
# Give it a class name based on the color (colors is a map)
span.setAttribute("class", colors[fonts[0].getAttribute("color")])

# Place all the children inside
while(fonts[0].firstChild):
span.appendChild(fonts[0].firstChild)
# end while

# Replace the <font> with a the <span>
print(fonts[0].parentNode.toxml())
fonts[0].parentNode.replaceChild(span, fonts[0])
# end while

问题在于,与 JavaScript 不同,该元素并未像应有的那样从 fonts 中删除。我是否应该使用一个更好的库来使用标准(3级)DOM规则,或者如果我不想使用xPath(所有其他DOM解析器似乎都使用它),我是否只需要破解它)?

谢谢。

最佳答案

您可以在 the documentation 中看到对于 Python DOM(页面最底部),它不像“真正的”DOM 那样工作,因为从 getElementsByTagName 获得的集合不是“实时”的。此处使用 getElementsByTagName 只会返回当时匹配元素的静态快照。对于 Python,这通常不是问题,因为当您使用 xml.dom 时,您并不是在浏览器中使用实时更新的页面;而是在使用 xml.dom 时。您只是操作从文件或字符串解析的静态 DOM,因此您知道在您不查看时没有其他代码会扰乱 DOM。

在大多数情况下,您可能可以通过更改代码结构来反射(reflect)这一点来获得您想要的结果。对于这种情况,您应该能够通过以下方式实现您的目标:

fonts = doc.getElementsByTagName('font')

for font in fonts:
# Create a new span
span = doc.createElement("span")
# Give it a class name based on the color (colors is a map)
span.setAttribute("class", colors[font.getAttribute("color")])

# Place all the children inside
while(font.firstChild):
span.appendChild(font.firstChild)
# end while

# Replace the <font> with a the <span>
font.parentNode.replaceChild(span, font)

我们的想法是,您不必总是查看 fonts 中的第一个元素,而是迭代每个元素并一次替换它们。

由于这些差异,如果您的 JavaScript DOM 代码使用这些类型的动态 DOM 更新,您将无法将其“逐字”移植到 Python(使用相同的 DOM 调用)。然而,有时以这种不太动态的方式来做可能会更容易,因为你脚下的事情变化较少。

关于Python MiniDom 无法正确删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27830834/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com