Ich muss Elemente basierend auf dem Inhalt eines Attributs mit Pythons lxml vollständig entfernen. Beispiel:
import lxml.etree as et
xml="""
<groceries>
<fruit state="rotten">apple</fruit>
<fruit state="fresh">pear</fruit>
<fruit state="fresh">starfruit</fruit>
<fruit state="rotten">mango</fruit>
<fruit state="fresh">peach</fruit>
</groceries>
"""
tree=et.fromstring(xml)
for bad in tree.xpath("//fruit[@state=\'rotten\']"):
#remove this element from the tree
print et.tostring(tree, pretty_print=True)
Ich möchte dies drucken:
<groceries>
<fruit state="fresh">pear</fruit>
<fruit state="fresh">starfruit</fruit>
<fruit state="fresh">peach</fruit>
</groceries>
Gibt es eine Möglichkeit, dies zu tun, ohne eine temporäre Variable zu speichern und manuell darauf zu drucken:
newxml="<groceries>\n"
for elt in tree.xpath('//fruit[@state=\'fresh\']'):
newxml+=et.tostring(elt)
newxml+="</groceries>"
Sie suchen die
remove
Funktion. Rufen Sie die Methode remove des Baums auf und übergeben Sie ihm ein zu entfernendes Unterelement.Ergebnis:
quelle
.remove()
das Element ein Kind des Elements sein muss, auf das Sie es aufrufen. Sie müssen es also auf dem übergeordneten Element des Elements aufrufen, das Sie entfernen möchten. Antwort korrigiert.Ich habe eine Situation getroffen:
div.remove(script)
wird dentext here
Teil entfernen, den ich nicht wollte.Nach der Antwort hier fand ich, dass dies
etree.strip_elements
eine bessere Lösung für mich ist, mit der Sie steuern können, ob Sie den Text dahinter mitwith_tail=(bool)
param entfernen oder nicht .Aber ich weiß immer noch nicht, ob dies den xpath-Filter für Tags verwenden kann. Setzen Sie dies einfach zur Information.
Hier ist das Dokument:
quelle
Wie bereits erwähnt, können Sie mit dieser
remove()
Methode (Unter-) Elemente aus dem Baum löschen:Das Element einschließlich seiner Elemente wird jedoch entfernt. Dies
tail
ist ein Problem, wenn Sie Dokumente mit gemischtem Inhalt wie HTML verarbeiten:Wird
Welches ist ich nehme an, was Sie nicht immer wollen :) Ich habe eine Hilfsfunktion erstellt, um nur das Element zu entfernen und seinen Schwanz zu behalten:
Auf diese Weise bleibt der Endtext erhalten:
quelle
el.tail is not None
, da es einen solchen Fall geben könnte.Sie können auch HTML von lxml verwenden, um das zu lösen:
Es sollte dies ausgeben:
quelle