2011-01-13 19 views
17

sorun şudur: Bir XML parçası şöyle var: - ve <c> -Tags ama onların (metin) -contents ve childNodes sadece korumak sonuç içinlxml'de bir etiketi nasıl kaldırırım ancak tüm içeriği koruyabilirim?

<fragment>text1 <a>inner1 </a>text2 <b>inner2</b> <c>t</c>ext3</fragment> 

, tüm <a> kaldırmak istiyor oldukları gibi. Ayrıca, <b> -Eleman dokunulmadan bırakılmalıdır. Sonuç daha sonra ben çok kirli bir hile dönmek edeceğiz an için böylece

<fragment>text1 inner<d>1</d> text2 <b>inner2</b> text3</fragment> 

görünmelidir: Ben, fragman etree.tostring regex aracılığıyla kusurlu etiketlerini kaldırmak ve orijinal parçasını değiştiririz Bunun etree.fromstring sonucu (değil gerçek kod, ancak böyle bir şey gitmeli): Ben muhtemelen bunu başarmak için xslt kullanabileceğinizi biliyor

from lxml import etree 
fragment = etree.fromstring("<fragment>text1 <a>inner1 </a>text2 <b>inner2</b> <c>t</c>ext3</fragment>") 
fstring = etree.tostring(fragment) 
fstring = fstring.replace("<a>","") 
fstring = fstring.replace("</a>","") 
fstring = fstring.replace("<c>","") 
fstring = fstring.replace("</c>","") 
fragment = etree.fromstring(fstring) 

ve bunun lxml XSLT'de yararlanabilir biliyorum ama daha lxml doğal bir yaklaşım olmalı?

Referans için: lxml'nin element.replace ile oraya gitmeyi denedim, ancak daha önce bir eleman düğümü bulunan metin eklemek istediğimden, bunu yapabileceğimi sanmıyorum.

cevap

31

bu deneyin: LXML ait http://lxml.de/api/lxml.etree-module.html#strip_tags

>>> etree.strip_tags(fragment,'a','c') 
>>> etree.tostring(fragment) 
'<fragment>text1 inner1 text2 <b>inner2</b> text3</fragment>' 
+0

Teşekkürler, bu mükemmel çalışıyor. "Şeridi" terimi bana gelmedi, ya da ben kendi kendime cevap bulabilirdim :) – Thor

+0

Cidden. PyCon 2011'de mi olacaksın? Eğer öyleyse, size bir bira ya da tercih ettiğiniz içecek ne olursa olsun. Sadece benim gecemi yaptım :) – mkelley33

+0

Ayrıca harika: '' etree.strip_elements (parça, * ['tag1', 'tag2']) '' – mkelley33

1

Kullanım Temizleyici işlevinde html içeriğinden etiketleri çıkarın. Aşağıda, ne istediğinizi yapmak için bir örnek. Bir HTML belgesi için, Cleaner, strip_elements kullanmaktan ziyade problem için daha iyi bir genel çözümdür, çünkü bu gibi durumlarda sadece etiketden daha fazlasını çıkarmak istersiniz; Diğer etiketlerdeki onclick = function() nitelikleri gibi şeylerden de kurtulmak istersiniz.

import lxml 
from lxml.html.clean import Cleaner 
cleaner = Cleaner() 
cleaner.remove_tags = ['p'] 
remove_tags: 

Kaldırılacak etiketlerin listesi. Yalnızca etiketler kaldırılacak, içerikleri ana etikete çekilecektir.

İlgili konular