Supprimer toutes les Balises javascript et les balises style de html avec python et le module lxml

j'analyse un document html en utilisant le http://lxml.de / library. Jusqu'à présent, j'ai compris comment supprimer des balises d'un document html dans lxml, comment supprimer une balise mais conserver tout le contenu? , mais la méthode décrite dans ce post laisse tout le texte, dépouillant les balises avec suppression du script. J'ai aussi trouvé une référence de classe à lxml.HTML.propre.Nettoyeur http://lxml.de/api/lxml.html.clean.Cleaner-class.html mais c'est aussi clair que la façon d'utiliser réellement la classe pour nettoyer le document. Toute aide, peut-être un petit exemple serait utile pour moi!

21
demandé sur Community 2011-12-18 23:01:19

3 réponses

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

#!/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 la lxml.HTML.propre.Documentation plus propre ; certains les options que vous pouvez simplement définir à True ou False (la valeur par défaut) et d'autres prennent une liste comme:

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

noter 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).
52
répondu aculich 2011-12-18 19:43:04

vous pouvez utiliser la méthode strip_elements pour supprimer des scripts, puis utiliser strip_tags méthode pour supprimer d'autres tags:

etree.strip_elements(fragment, 'script')
etree.strip_tags(fragment, 'a', 'p') # and other tags that you want to remove
4
répondu cenanozen 2011-12-18 19:11:05

vous pouvez également utiliser bs4 libray à cette fin.

soup = BeautifulSoup(html_src, "lxml")
[x.extract() for x in soup.findAll(['script', 'style'])]
2
répondu Shafiq 2017-01-13 05:17:35