2011-12-18 17 views
16

Sto analizzando un documento html utilizzando la libreria http://lxml.de/. Finora ho capito come rimuovere tag da un documento html In lxml, how do I remove a tag but retain all contents? ma il metodo descritto in quel post lascia tutto il testo, eliminando i tag senza rimuovere lo script vero e proprio. Ho anche trovato un riferimento di classe a lxml.html.clean.Cleaner http://lxml.de/api/lxml.html.clean.Cleaner-class.html ma questo è chiaro come il modo in cui utilizzare effettivamente la classe per pulire il documento. Qualsiasi aiuto, forse un breve esempio, mi sarebbe utile!Rimuovi tutti i tag javascript e i tag di stile da html con python e il modulo lxml

risposta

45

Di seguito è riportato un esempio per fare quello che vuoi. Per un documento HTML, Cleaner è una soluzione generale migliore del problema rispetto all'utilizzo di strip_elements, perché in casi come questo si desidera rimuovere più del semplice tag <script>; vuoi anche sbarazzarti di cose come gli attributi onclick=function() su altri tag.

#!/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'))) 

È possibile ottenere un elenco delle opzioni che è possibile impostare nel lxml.html.clean.Cleaner documentation; alcune opzioni si può solo impostare a True o False (il default) e altri prendono un elenco come:

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

nota che la differenza tra uccidere vs remove:

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

Perfetto, grazie mille! –

+0

Sono stato fuori gran parte della giornata, avrei dovuto farlo prima credo. Ho appena notato, dopo aver giocato con questo, che la cosa kill_tags non sembra effettivamente fare nulla, ad esempio ho aggiunto 'cleaner.kill_tags = ('img', 'noscript', 'a')' ma quei tag rimangono nel documento di output , il resto dell'esempio sopra funziona come previsto, è solo dopo aver giocato con i kill tag che ho notato. –

+0

Nota nel mio esempio uso parentesi quadre, non parentesi. Dovresti provare '['img', 'noscript', 'a']'. Le parentesi quadre indicano una lista, mentre le parentesi indicano una tupla (nell'esempio una tupla di 3 elementi). Le tuple e le liste non sono affatto le stesse. – aculich

4

È possibile utilizzare il metodo strip_elements per rimuovere gli script, quindi utilizzare strip_tags metodo per rimuovere altri tag:

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

Per un documento HTML quando si toglie gli script che si desidera per sbarazzarsi di tutti i javascript, non solo i ''