Есть ли способ удалить/экранировать html-теги, используя lxml.html, а не BeautifulSoup, у которого есть некоторые проблемы с xss? Я пытался использовать очиститель, но я хочу удалить весь html.
Удалить весь html в python?
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
Я хочу избавиться от всего, а не только от небезопасных тегов
- person Timmy; 20.10.2010
Если вы хотите избавиться от всего, почему бы просто не
text=''
? ;-) Серьезно, text_content()
избавится от всей разметки, но очистка также избавит, например. правила таблицы стилей css и javascript, которые также кодируются как текст внутри элемента (но я предположил, что вас интересует только реальный текст, поэтому сначала нужно очистить)
- person Steven; 20.10.2010
использовал clean_html (string), который делает разные вещи
- person Timmy; 21.10.2010
когда я использую html.fromstring вместо html.parse, я получаю сообщение об ошибке AttributeError: объект «HtmlElement» не имеет атрибута «getroot»
- person kommradHomer; 22.07.2014
@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
После быстрого эксперимента это решение, похоже, работает намного лучше, чем это, например, stackoverflow.com/a/5332984/787842, но я хотел бы узнать больше о том, как правильно параметризовать объект
Cleaner
(поскольку вариантов много, много); например, в этом случае наличие пустого списка allow_tags
и remove_unknown_tags
, установленного на False
, логически выглядит для меня немного странно.
- person cjauvin; 11.05.2015
@cjauvin: Конечно, ты прав! Это своего рода хак. Но я уверен, что никто не захочет указывать все теги, которые необходимо удалить, в аргументе
remove_tags
, если они хотят удалить их все. К сожалению, в этом случае реализация Cleaner
побуждает пользователей использовать allow_tags
с remove_unknown_tags
для этих целей ="nofollow noreferrer">github.com/lxml/lxml/blob/
- person dni; 13.05.2015
Это оборачивает результат в 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