Удалите все теги javascript и теги стиля из html с помощью python и модуля lxml - PullRequest
24 голосов
/ 18 декабря 2011

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

Ответы [ 3 ]

56 голосов
/ 18 декабря 2011

Ниже приведен пример, чтобы делать то, что вы хотите. Для 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 и 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).
4 голосов
/ 18 декабря 2011

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

etree.strip_elements(fragment, 'script')
etree.strip_tags(fragment, 'a', 'p') # and other tags that you want to remove
2 голосов
/ 13 января 2017

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

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