2010-10-19 2 views
1

Есть ли способ удалить/удалить теги html с помощью lxml.html и не beautifulsoup, у которого есть некоторые проблемы с xss? Я пытался использовать cleaner, но я хочу удалить все html.Удалить все html в python?

+7

Как BeautifulSoup проблемы межсайтовых скриптов? – jball

ответ

9

Попробуйте метод .text_content() на элемент, возможно, лучше всего после использования lxml.html.clean, чтобы избавиться от нежелательного контента (теги скриптов и т. Д.). Например:

from lxml import html 
from lxml.html.clean import clean_html 

tree = html.parse('http://www.example.com') 
tree = clean_html(tree) 

text = tree.getroot().text_content() 
+0

Я хочу избавиться от всего, а не только от небезопасных тегов – Timmy

+1

Если вы хотите избавиться от всего, почему бы не просто 'text = '''? ;-) Серьезно, 'text_content()' БУДЕТ избавиться от всей разметки, но очистка также будет устранена, например. css rulesheet rules и javascript, которые также закодированы как текст * внутри * элемента (но я предположил, что вас интересует только «реальный» текст, следовательно, сначала очистка). – Steven

+0

использовал clean_html (string), который имеет разные значения. – Timmy

11

Я считаю, что этот код может помочь вам:

from lxml.html.clean import Cleaner 

html_text = "<html><head><title>Hello</title><body>Text</body></html>" 
cleaner = Cleaner(allow_tags=[''], remove_unknown_tags=False) 
cleaned_text = cleaner.clean_html(html_text) 
+0

После быстрого эксперимента это решение, похоже, выполняет гораздо лучшую работу, чем эта, например http://stackoverflow.com/a/5332984/787842, но я хотел бы узнать больше о том, как правильно параметризовать объект 'Cleaner' (поскольку существует множество опций); например, в этом случае наличие пустого списка 'allow_tags' и' remove_unknown_tags', установленного в 'False', выглядит мне немного странным, логически. – cjauvin

+0

@cjauvin: Конечно, вы правы! Это своего рода хак. Но я уверен, что никто не хочет указывать все теги, необходимые для удаления в аргументе 'remove_tags', если они хотят удалить все из них. К сожалению, в этом случае реализация 'Cleaner' поощряет пользователей использовать' allow_tags' с 'remove_unknown_tags' для этих целей https://github.com/lxml/lxml/blob/54a8bfedcd0f32274a4ebf9e2d8e391fe759aba5/src/lxml/html/clean.py#L387 – dni