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


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

3 21

3 ответа:

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

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

Обратите внимание, что разница между kill и 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).

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

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

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

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