Удалить весь html в python?

Есть ли способ удалить/экранировать html-теги, используя lxml.html, а не BeautifulSoup, у которого есть некоторые проблемы с xss? Я пытался использовать очиститель, но я хочу удалить весь html.


person Timmy    schedule 19.10.2010    source источник
comment
Как у BeautifulSoup возникают проблемы с межсайтовым скриптингом?   -  person jball    schedule 20.10.2010
comment
Возможно, они имели в виду CSS.   -  person jrc    schedule 04.11.2018


Ответы (3)


Попробуйте метод .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()
person Steven    schedule 20.10.2010
comment
Я хочу избавиться от всего, а не только от небезопасных тегов - person Timmy; 20.10.2010
comment
Если вы хотите избавиться от всего, почему бы просто не text=''? ;-) Серьезно, text_content() избавится от всей разметки, но очистка также избавит, например. правила таблицы стилей css и javascript, которые также кодируются как текст внутри элемента (но я предположил, что вас интересует только реальный текст, поэтому сначала нужно очистить) - person Steven; 20.10.2010
comment
использовал clean_html (string), который делает разные вещи - person Timmy; 21.10.2010
comment
когда я использую html.fromstring вместо html.parse, я получаю сообщение об ошибке AttributeError: объект «HtmlElement» не имеет атрибута «getroot» - person kommradHomer; 22.07.2014
comment
@kommradHomer: это потому, что parse() возвращает дерево элементов, а fromstring() возвращает элемент (поэтому вам не нужен getroot() в вашем случае) - person Steven; 22.07.2014

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

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)
person dni    schedule 22.03.2013
comment
После быстрого эксперимента это решение, похоже, работает намного лучше, чем это, например, stackoverflow.com/a/5332984/787842, но я хотел бы узнать больше о том, как правильно параметризовать объект Cleaner (поскольку вариантов много, много); например, в этом случае наличие пустого списка allow_tags и remove_unknown_tags, установленного на False, логически выглядит для меня немного странно. - person cjauvin; 11.05.2015
comment
@cjauvin: Конечно, ты прав! Это своего рода хак. Но я уверен, что никто не захочет указывать все теги, которые необходимо удалить, в аргументе remove_tags, если они хотят удалить их все. К сожалению, в этом случае реализация Cleaner побуждает пользователей использовать allow_tags с remove_unknown_tags для этих целей ="nofollow noreferrer">github.com/lxml/lxml/blob/ - person dni; 13.05.2015
comment
Это оборачивает результат в div - person cmc; 16.01.2019

При этом используются функции очистки lxml, но результат не помещается в HTML-элемент.

import lxml

doc = lxml.html.document_fromstring(str) 
cleaner = lxml.html.clean.Cleaner(allow_tags=[''], remove_unknown_tags=False)
str = cleaner.clean_html(doc).text_content() 

или как один лайнер

lxml.html.clean.Cleaner(allow_tags=[''], remove_unknown_tags=False).clean_html(lxml.html.document_fromstring(str)).text_content()

Он работает, обеспечивая синтаксический анализ html вручную в объект документа и передавая его классу очистки. Таким образом, clean_html также возвращает объект, а не строку. Затем текст можно восстановить без элемента-обертки с помощью метода text_content().

person cmc    schedule 16.01.2019