2011-12-18 1 views
16

Я анализирую html-документ, используя библиотеку http://lxml.de/. До сих пор я выяснил, как вырезать теги из html-документа In lxml, how do I remove a tag but retain all contents?, но метод, описанный в этом сообщении, оставляет весь текст, удаляя теги с удалением фактического скрипта. Я также нашел ссылку на класс для lxml.html.clean.Cleaner http://lxml.de/api/lxml.html.clean.Cleaner-class.html, но это ясно, как грязь о том, как на самом деле использовать класс для очистки документа. Любая помощь, возможно, короткий пример будет полезен для меня!Удалить все теги javascript и теги стиля из html с помощью python и модуля lxml

ответ

45

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

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

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

Отлично, спасибо! –

+0

Я пробыл большую часть дня, должен был довести это раньше, я думаю. Я просто заметил после игры, что вещь kill_tags, похоже, ничего не делает, например, я добавил 'cleaner.kill_tags = ('img', 'noscript', 'a')', но эти теги остаются в выходном документе , остальная часть приведенного выше примера работает так, как ожидалось, сразу после игры с тегами kill, которые я заметил это. –

+0

Извещение в моем примере Я использую квадратные скобки, а не круглые скобки. Вы должны попробовать '['img', 'noscript', 'a']'. Квадратные скобки обозначают список, тогда как круглые скобки обозначают кортеж (в вашем примере 3-элементный кортеж). Кортежи и списки не совпадают. – aculich

4

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

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

Для HTML-документа при удалении скриптов, которые вы хотите, чтобы избавиться от ВСЕХ JavaScript, а не только ''