2016-07-29 5 views
0

Hier ist mein Python-Code mit lxmllxml entfernt ungeöffneten Text innerhalb Tages

import urllib.request 
from lxml import etree 
#import lxml.html as html 
from copy import deepcopy 
from lxml import etree 
from lxml import html 


some_xml_data = "<span>text1<div>ddd</div>text2<div>ddd</div>text3</span>" 
root = etree.fromstring(some_xml_data) 
[c] = root.xpath('//span') 
print(etree.tostring(root)) #b'<span>text1<div>ddd</div>text2<div>ddd</div>text3</span>' #output as expected 
#but if i do some changes 
for e in c.iterchildren("*"): 
    if e.tag == 'div': 
     e.getparent().remove(e) 

print(etree.tostring(root)) #b'<span>text1</span>' text2 and text3 removed! how to prevent this deletion? 

Es sieht aus wie nach mir einige Änderungen am lxml Baum (löschen einige Tags) lxml auch einig ungeöffneten Text entfernen! Wie verhindere ich, dass lxml dies tut und nicht gespeicherten Text speichert?

Antwort

1

Der Text nach Knoten Schwanz genannt wird, und sie können hier durch Anhängen an Eltern Text reserviert ist ein Beispiel:

In [1]: from lxml import html 

In [2]: s = "<span>text1<div>ddd</div>text2<div>ddd</div>text3</span>" 
    ...: 

In [3]: tree = html.fromstring(s) 

In [4]: for node in tree.iterchildren("div"): 
    ...:  if node.tail: 
    ...:   node.getparent().text += node.tail 
    ...:  node.getparent().remove(node) 
    ...:  

In [5]: html.tostring(tree) 
Out[5]: b'<span>text1text2text3</span>' 

ich html verwenden, da es eher die Struktur als XML ist . Und Sie können einfach iterchildren mit div vermeiden zusätzliche Kontrolle für Tag.