我的任務就是做XML樹的一些元素的微小的重構在Python 3,即替換以下結構:條件移除元素的
<span class="nobr">
<a href="http://www.google.com/">
http://www.google.com/
<sup>
<img align="absmiddle" alt="" border="0" class="rendericon" height="7" src="http://jira.atlassian.com/icon.gif" width="7"/>
</sup>
</a>
</span>
有了:
<span class="nobr">
<a href="http://www.google.com/">
http://www.google.com/
</a>
</span>
即 - 如果整個結構與第一個例子中給出的結構完全一致,請移除sup元素。我需要在處理過程中保留XML文檔,所以正則表達式匹配不是可能的。
我已經有代碼的工作,我的目的:
doc = self.__refactor_links(doc)
...
def __refactor_links(self, node):
"""Recursively seeks for links to refactor them"""
for span in node.childNodes:
replace = False
if isinstance(span, xml.dom.minidom.Element):
if span.tagName == "span" and span.getAttribute("class") == "nobr":
if span.childNodes.length == 1:
a = span.childNodes.item(0)
if isinstance(a, xml.dom.minidom.Element):
if a.tagName == "a" and a.getAttribute("href"):
if a.childNodes.length == 2:
aurl = a.childNodes.item(0)
if isinstance(aurl, xml.dom.minidom.Text):
sup = a.childNodes.item(1)
if isinstance(sup, xml.dom.minidom.Element):
if sup.tagName == "sup":
if sup.childNodes.length == 1:
img = sup.childNodes.item(0)
if isinstance(img, xml.dom.minidom.Element):
if img.tagName == "img" and img.getAttribute("class") == "rendericon":
replace = True
else:
self.__refactor_links(span)
if replace:
a.removeChild(sup)
return node
這一次不會通過所有的標籤遞歸地運行 - 如果它匹配相似,它尋求結構的東西 - 即使它失敗,它不會繼續尋找這些元素內部的結構,但在我的情況下,我不應該這樣做(雖然這也會很好,但是增加一堆其他成本:self .__ refactor_links(tag)kill它在我眼中)。
如果任何條件失敗,則不應該發生移除。有沒有更清晰的方式來定義一組條件,避免大量'ifs'?一些自定義數據結構可以用於存儲條件,例如, ('sup',('img',(...))),但我不知道應該如何處理它。如果你在Python中有任何建議或例子 - 請幫忙。
謝謝。
Ouch。 'import this'':'... Flat比嵌套更好。 ...' – 2010-11-12 00:38:23