BeautifulSoup4 извлекает все виды условных комментариев

Что я пытаюсь сделать:

Удалите подозрительные комментарии из HTML-писем с помощью bs4. Теперь я столкнулся с проблемой с так называемым conditional comments типа downlevel-revealed,

См.: https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/compatibility/ms537512(v=vs.85)#syntax-of-conditional-comments

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 обрабатывает условные комментарии так, как это делают современные браузеры. Это прекрасно для моих обстоятельств.

Другие вопросы по тегам