BeautifulSoup4 извлекает все виды условных комментариев
Что я пытаюсь сделать:
Удалите подозрительные комментарии из HTML-писем с помощью bs4. Теперь я столкнулся с проблемой с так называемым conditional comments
типа downlevel-revealed
,
import bs4
html = 'A<!--[if expression]>a<![endif]-->' \
'B<![if expression]>b<![endif]>'
soup = bs4.BeautifulSoup(html, 'html5lib')
for comment in soup.find_all(text=lambda text: isinstance(text, bs4.Comment)):
comment.extract()
Для получения комментариев:
'A',
'[if expression]>a<![endif]',
'B',
'[if expression]',
'b',
'[endif]',
После извлечения комментариев:
'A',
'B',
'b',
Проблема:
Маленький б также должен быть удален. Проблема в том, что bs4 обнаруживает первый комментарий как один объект комментария, а второй - как 3 объекта. Комментарий (если), NavigableString(b) и Комментарий (endif). Извлечение просто удаляет оба типа комментариев. NavigableString с содержимым "b" остается в DOM.
Любое решение этого?
1 ответ
После некоторого времени чтения об условных комментариях я могу понять, почему это происходит именно так.
Downlevel скрытая
downlevel-hidden
в основном написаны как нормальный комментарий <!-- ... -->
, Это определяется как блок условных комментариев в современных браузерах. Поэтому BeautifulSoup удаляет его полностью, если я хочу удалить условные комментарии.
Downlevel-показало
downlevel-revealed
написаны как <!...>b<!...>
современные браузеры обнаруживают два тега как недействительные и игнорируют их в DOM, поэтому просто b
остается в силе. Поэтому BeautifulSoup удаляет только теги, а не контент
Заключение
BeautifulSoup обрабатывает условные комментарии так, как это делают современные браузеры. Это прекрасно для моих обстоятельств.