it-swarm-pt.tech

Remova todas as tags javascript e tags de estilo de html com python e o módulo lxml

Estou analisando um documento html usando a biblioteca http://lxml.de/ . Até agora, descobri como retirar as tags de um documento html Em lxml, como faço para remover uma tag, mas retenho todo o conteúdo? mas o método descrito naquele post deixa todo o texto, retirando as tags sem remover o script real. Também encontrei uma referência de classe para lxml.html.clean.Cleaner http://lxml.de/api/lxml.html.clean.Cleaner-class.html mas isso é claro como lama como para saber como usar a classe para limpar o documento. Qualquer ajuda, talvez um pequeno exemplo, seria útil para mim!

27
john-charles

Abaixo está um exemplo para fazer o que quiser. Para um documento HTML, Cleaner é uma solução geral melhor para o problema do que usar strip_elements, Porque em casos como esse você deseja remover mais do que apenas a tag <script>; você também deseja se livrar de coisas como atributos onclick=function() em outras 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'))))

Você pode obter uma lista das opções que pode definir na documentação lxml.html.clean.Cleaner ; algumas opções você pode simplesmente definir como True ou False (o padrão) e outras obter uma lista como:

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

Observe que a diferença entre matar e remover:

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).
56
aculich

Você pode usar o método strip_elements para remover scripts e, em seguida, usar o método strip_tags para remover outras tags:

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

Você pode usar bs4 libray também para este propósito.

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