Question Supprimez tous les tags javascript et les tags de style de html avec python et le module lxml


Je analyse un document HTML en utilisant le http://lxml.de/ bibliothèque. Jusqu'à présent, j'ai compris comment supprimer les balises d'un document HTML En lxml, comment supprimer une étiquette mais en conserver tout le contenu? mais la méthode décrite dans cet article laisse tout le texte, supprimant les balises sans supprimer le script réel. J'ai également trouvé une référence de classe à lxml.html.clean.Cleaner http://lxml.de/api/lxml.html.clean.Cleaner-class.html mais ceci est clair comme de la boue quant à la manière d'utiliser la classe pour nettoyer le document. Toute aide, peut-être un court exemple me serait utile!


20
2017-12-18 19:01


origine


Réponses:


Voici un exemple pour faire ce que vous voulez. Pour un document HTML, Cleaner est une meilleure solution générale au problème que l'utilisation strip_elements, parce que dans des cas comme celui-ci, vous voulez supprimer plus que la simple <script> marque; vous voulez aussi vous débarrasser de choses comme onclick=function() attributs sur d'autres balises.

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

Vous pouvez obtenir une liste des options que vous pouvez définir dans le Documentation lxml.html.clean.Cleaner; certaines options que vous pouvez définir sur True ou False (par défaut) et d'autres prennent une liste comme:

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

Notez que la différence entre kill 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).

51
2017-12-18 19:37



Vous pouvez utiliser le strip_elements méthode pour supprimer les scripts, puis utiliser strip_tags méthode pour supprimer d'autres balises:

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

4
2017-12-18 19:11



Vous pouvez également utiliser bs4 libray à cette fin.

soup = BeautifulSoup(html_src, "lxml")
[x.extract() for x in soup.findAll(['script', 'style'])]

2
2018-01-13 05:17