2011-01-13 22 views
17

समस्या यह है: मैं बहुत की तरह एक XML टुकड़ा है: - और <c> -Tags, लेकिन उनके (पाठ) -contents, और childNodes बस बनाए रखनेlxml में, मैं एक टैग कैसे हटा सकता हूं लेकिन सभी सामग्री को बरकरार रखता हूं?

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

परिणाम के लिए, मैं सब <a> निकालना चाहते हैं जैसे वो हे वैसे। इसके अलावा, <b> -Element को छूटा नहीं छोड़ा जाना चाहिए। परिणाम तो दिखना चाहिए इस प्रकार

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

कुछ समय के लिए, मैं एक बहुत ही गंदा चाल पर वापस लौटने देंगे: मैं टुकड़ा etree.tostring होगा, regex के माध्यम से हमलावर टैग हटा दें, और के साथ मूल टुकड़ा की जगह इस के etree.fromstring परिणाम (नहीं वास्तविक कोड है, लेकिन कुछ इस तरह जाना चाहिए):

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) 

मुझे पता है कि मैं शायद इस लक्ष्य को हासिल करने के लिए उपयोग कर सकते हैं xslt, और मुझे पता है कि lxml xslt का उपयोग कर सकते , लेकिन एक और अधिक एलएक्सएमएल मूल दृष्टिकोण होना चाहिए?

संदर्भ के लिए: मैंने lxml के element.replace के साथ वहां पहुंचने का प्रयास किया है, लेकिन चूंकि मैं टेक्स्ट को सम्मिलित करना चाहता हूं जहां पहले कोई तत्व नोड था, मुझे नहीं लगता कि मैं ऐसा कर सकता हूं।

उत्तर

31

इस प्रयास करें: html सामग्री से टैग हटाना 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

धन्यवाद, यह पूरी तरह से काम करता है। "स्ट्रिप" शब्द मेरे लिए नहीं हुआ था, या मुझे खुद का जवाब मिल गया होगा :) – Thor

+0

गंभीरता से। क्या आप पिकॉन 2011 में होंगे? यदि ऐसा है, तो मुझे आपको एक बियर, या जो भी आपका पसंदीदा पेय खरीदते हैं। आपने अभी मेरी रात बनाई है :) – mkelley33

+0

भी कमाल: 'etree.strip_elements (खंड, * ['टैग 1', 'टैग 2'])' ' – mkelley33

1

उपयोग lxml का क्लीनर कार्य करते हैं। नीचे जो कुछ आप चाहते हैं उसे करने के लिए एक उदाहरण है। एक HTML दस्तावेज़ के लिए, क्लीनर स्ट्रिप_लेमेंट्स का उपयोग करने से समस्या का बेहतर सामान्य समाधान है, क्योंकि इस तरह के मामलों में आप केवल टैग से अधिक पट्टी करना चाहते हैं; आप अन्य टैग पर ऑनक्लिक = फ़ंक्शन() विशेषताओं जैसी चीजों से छुटकारा पाना चाहते हैं।

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

निकालने के लिए टैग की एक सूची। केवल टैग हटा दिए जाएंगे, उनकी सामग्री मूल टैग में खींची जाएगी।

संबंधित मुद्दे