Najprostszym rozwiązaniem jest prawdopodobnie za pomocą lxml, w którym można ustawić opcję parsera ignorować spacje między elementami:
>>> from lxml import etree
>>> parser = etree.XMLParser(remove_blank_text=True)
>>> xml_str = '''<root>
>>> <head></head>
>>> <content></content>
>>> </root>'''
>>> elem = etree.XML(xml_str, parser=parser)
>>> print etree.tostring(elem)
<root><head/><content/></root>
Prawdopodobnie będzie to wystarczające dla Twoich potrzeb, ale niektóre ostrzeżenia, aby na wszelki wypadek strona:
To będzie po prostu usunąć whitespace węzłów między elementami, a nie próbować usunąć whitespace węzły wewnątrz elementów z zawartością mieszaną:
>>> elem = etree.XML('<p> spam <a>ham</a> <a>eggs</a></p>', parser=parser)
>>> print etree.tostring(elem)
<p> spam <a>ham</a> <a>eggs</a></p>
Początkowe lub końcowe białe spacje ze znaków tekstowych nie zostaną usunięte. Będzie jednak nadal w pewnych okolicznościach usuwać białe spacje z mieszanych treści: jeśli parser nie natrafił jeszcze na węzły inne niż białe na tym poziomie.
>>> elem = etree.XML('<p><a> ham</a> <a>eggs</a></p>', parser=parser)
>>> print etree.tostring(elem)
<p><a> ham</a><a>eggs</a></p>
Jeśli użytkownik nie chce, że można użyć xml:space="preserve"
, które będą przestrzegane. Inną opcją byłoby użycie dtd i użycie etree.XMLParser(load_dtd=True)
, gdzie parser użyje dtd do określenia, które białe znaki są znaczące.
Poza tym, trzeba będzie napisać własny kod, aby usunąć spacje nie chcesz (iteracji potomków, aw stosownych przypadkach, ustaw .text
i .tail
właściwości zawierające tylko białe znaki do None
lub pusty ciąg)
to może pomóc stosując lxml usunąć wszystkie puste linie i biało-spacje z węzła tekstowego http://stackoverflow.com/a/19396130/973699 – DevC