2011-12-18 11 views
16

मैं http://lxml.de/ लाइब्रेरी का उपयोग कर एक HTML दस्तावेज़ पार्स कर रहा हूं। अब तक मैंने यह पता लगाया है कि एचटीएमएल दस्तावेज़ In lxml, how do I remove a tag but retain all contents? से टैग कैसे पट्टी करें लेकिन उस पोस्ट में वर्णित विधि सभी पाठ छोड़ देती है, जिससे वास्तविक स्क्रिप्ट को हटाकर टैग को अलग किया जाता है। मुझे lxml.html.clean.Cleaner http://lxml.de/api/lxml.html.clean.Cleaner-class.html का क्लास संदर्भ भी मिला है, लेकिन यह दस्तावेज़ को साफ करने के लिए कक्षा का वास्तव में उपयोग करने के तरीके के रूप में स्पष्ट है। कोई मदद, शायद एक छोटा सा उदाहरण मेरे लिए सहायक होगा!पाइथन और एलएक्सएमएल मॉड्यूल के साथ एचटीएमएल से सभी जावास्क्रिप्ट टैग और स्टाइल टैग हटाएं

उत्तर

45

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

#!/usr/bin/env python 

import lxml 
from lxml.html.clean import Cleaner 

cleaner = Cleaner() 
cleaner.javascript = True # This is True because we want to activate the javascript filter 
cleaner.style = True  # This is True because we want to activate the styles & stylesheet filter 

print "WITH JAVASCRIPT & STYLES" 
print lxml.html.tostring(lxml.html.parse('http://www.google.com')) 
print "WITHOUT JAVASCRIPT & STYLES" 
print lxml.html.tostring(cleaner.clean_html(lxml.html.parse('http://www.google.com'))) 

आप विकल्प आप lxml.html.clean.Cleaner documentation में सेट कर सकते हैं की एक सूची प्राप्त कर सकते हैं; कुछ विकल्प आप बस True या False (डिफ़ॉल्ट) और दूसरों के लिए सेट कर सकते हैं लेने के एक सूची की तरह:

cleaner.kill_tags = ['a', 'h1'] 
cleaner.remove_tags = ['p'] 

ध्यान दें कि निकालें बनाम मार के बीच अंतर:

remove_tags: 
    A list of tags to remove. Only the tags will be removed, their content will get pulled up into the parent tag. 
kill_tags: 
    A list of tags to kill. Killing also removes the tag's content, i.e. the whole subtree, not just the tag itself. 
allow_tags: 
    A list of tags to include (default include all). 
+1

बिल्कुल सही, बहुत बहुत धन्यवाद! –

+0

मैं दिन के अधिकांश बाहर गया हूं, मुझे लगता है कि इसे पहले लाया जाना चाहिए था। मैंने बस इसके साथ खेलने के बाद देखा कि kill_tags चीज वास्तव में कुछ भी नहीं करती है उदाहरण के लिए मैंने 'cleaner.kill_tags = (' img ',' noscript ',' a ') जोड़ा है, लेकिन वे टैग आउटपुट दस्तावेज़ में रहते हैं , ऊपर दिया गया बाकी उदाहरण अपेक्षित काम करता है, यह सिर्फ हत्या टैग के साथ खेलने के बाद है जिसे मैंने देखा। –

+0

मेरे उदाहरण में नोटिस मैं वर्ग ब्रैकेट का उपयोग करता हूं, ब्रांड्स नहीं। आपको '[' img ',' noscript ',' a ']' 'का प्रयास करना चाहिए। स्क्वायर ब्रैकेट्स एक सूची को इंगित करते हैं, जबकि कोष्ठक एक ट्यूपल को इंगित करते हैं (आपके उदाहरण में 3-तत्व ट्यूपल)। टुपल्स और सूचियां बिल्कुल समान नहीं हैं। – aculich

4

आप अन्य टैग हटाना, लिपियों दूर करने के लिए तो strip_tags विधि का उपयोग strip_elements विधि का उपयोग कर सकते हैं:

etree.strip_elements(fragment, 'script') 
etree.strip_tags(fragment, 'a', 'p') # and other tags that you want to remove 
+1

एक HTML दस्तावेज के लिए जब स्क्रिप्ट आप सभी जावास्क्रिप्ट ही नहीं, ''