Python MiniDom没有正确删除元素

时间:2015-01-07 23:58:31

标签: python dom

我将一段JS代码转换为Python,我一直在使用迷你DOM,但某些事情并没有正常工作。他们在使用JavaScript运行时工作。我转换是因为我想要一致的更改/顺序(即添加类属性的地方),以及我可以使用一些Pythons更简单的功能。

我遇到的最新一期是:

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解析器看起来似乎使用)?

感谢。

1 个答案:

答案 0 :(得分:1)

你可以在the documentation中看到Python DOM(页面的最底部),它并不像真正的&#34;真正的&#34; DOM就像你从getElementsByTagName获得的集合不是&#34; live&#34;。在这里使用getElementsByTagName只返回当时匹配元素的静态快照。这通常不是Python的问题,因为当您使用xml.dom时,您不会在浏览器中使用实时更新页面;你只是操纵一个从文件或字符串中解析出来的静态DOM,所以你知道在你不看的时候没有其他代码会搞乱你。

在大多数情况下,您可以通过更改代码结构来反映这一点,从而获得所需内容。对于这种情况,您应该能够通过以下方式实现目标:

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更新,那么您将无法移植它&#34; verbatim&#34;到Python(使用相同的DOM调用)。然而,有时以这种不那么动态的方式做这件事可能会更容易,因为在你脚下的事情变化较少。