Удалите все теги javascript и теги стиля из html с помощью python и модуля lxml

Я анализирую html-документ, используя библиотеку http://lxml.de/. До сих пор я выяснил, как вырезать теги из html-документа В lxml, как удалить тег, но сохранить все содержимое?, но метод, описанный в этом сообщении, весь текст, сняв теги без удаления фактического script. Я также нашел ссылку на класс lxml.html.clean.Cleaner http://lxml.de/api/lxml.html.clean.Cleaner-class.html, но это ясно, поскольку грязь о том, как на самом деле использовать класс для очистки документа. Любая помощь, возможно, короткий пример будет полезен для меня!

Ответы

Ответ 1

Ниже приведен пример, чтобы сделать то, что вы хотите. Для HTML-документа Cleaner является лучшим общим решением проблемы, чем использование strip_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; некоторые параметры, которые вы можете установить только True или False (по умолчанию), а другие - список:

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

Обратите внимание, что разница между 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 content, i.e. the whole subtree, not just the tag itself.
allow_tags:
  A list of tags to include (default include all).

Ответ 2

Вы можете использовать метод strip_elements для удаления скриптов, затем используйте strip_tags для удаления других тегов:

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

Ответ 3

Вы также можете использовать bs4 libray для этой цели.

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