from xml.dom import minidom def text_from_node(node): t = [] for c in node.childNodes: if c.nodeType == 1: t.append(text_from_node(c)) else: t.append(c.nodeValue) return ' '.join(t) class NodeWrapper: def __init__(self, window, node): self._window = window self._node = node def __getattr__(self, name): if name == 'innerHTML': ret =[] for c in self._node.childNodes: ret.append(c.toxml()) return ''.join(ret) elif name == 'innerText': return text_from_node(self._node) ret = getattr(self._node, name) if isinstance(ret, minidom.Node) or isinstance(ret, minidom.NodeList): return NodeWrapper(self._window, ret) elif callable(ret): return DOMFunctionWrapper(self._window, ret) return ret def addEventListener(self, name, handler, something): self._window.events.append((name, handler, something)) class DOMFunctionWrapper: def __init__(self, window, func): self._window = window self._func = func def __call__(self, *args, **kwargs): ret = self._func(*args, **kwargs) if isinstance(ret, minidom.Node) or isinstance(ret, minidom.NodeList): return NodeWrapper(self._window, ret) elif callable(ret): return DOMFunctionWrapper(self._window, ret) return ret