BeautifulSoup4 извлекает все виды условных комментариев - PullRequest
0 голосов
/ 23 октября 2018

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

Удалять подозрительные комментарии из 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',

Проблема:

Также следует удалить маленькую букву b.Проблема в том, что bs4 обнаруживает первый комментарий как один объект комментария, а второй - как 3 объекта.Комментарий (если), NavigableString (b) и Комментарий (endif).Извлечение просто удаляет оба типа комментариев.NavigableString с содержимым «b» остается в DOM.

Есть ли какое-либо решение для этого?

1 Ответ

0 голосов
/ 14 ноября 2018

После некоторого времени чтения об условных комментариях я могу понять, почему это происходит таким образом.

downlevel-hidden

downlevel-hidden в основном написаны как обычный комментарий <!-- ... -->.Это определяется как блок условных комментариев в современных браузерах.Поэтому BeautifulSoup удаляет его полностью, если я хочу удалить условные комментарии.

downlevel-показали

downlevel-revealed записаны как <!...>b<!...>, современные браузеры обнаруживают два тега как недействительные и игнорируют их вDOM, так что b остается в силе.Поэтому BeautifulSoup удаляет только теги, а не содержимое

Заключение

BeautifulSoup обрабатывает условные комментарии, как это делают современные браузеры.Это отлично подходит для моих обстоятельств.

...