我将一段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解析器看起来似乎使用)?
感谢。
答案 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调用)。然而,有时以这种不那么动态的方式做这件事可能会更容易,因为在你脚下的事情变化较少。