BeautifulSoup4提取所有类型的条件注释

时间:2018-10-23 14:50:11

标签: python internet-explorer beautifulsoup conditional-comments html5lib

我想做什么:

使用bs4从html邮件中删除可疑注释。现在,我遇到了类型为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个对象。 Comment(if),NavigableString(b)和Comment(endif)。提取仅删除两种注释类型。内容为“ b”的NavigableString保留在DOM中。

对此有什么解决办法?

1 个答案:

答案 0 :(得分:0)

经过一段时间阅读有关条件注释的信息,我可以理解为什么会这样发生。

下级隐藏

downlevel-hidden基本上写为普通注释<!-- ... -->。在现代浏览器中,这被检测为条件注释块。因此,如果我想删除条件注释,BeautifulSoup会将其完全删除。

下层显示

downlevel-revealed被写为<!...>b<!...>,现代浏览器将这两个标记检测为无效并在DOM中忽略它们,因此仅b仍然有效。因此BeautifulSoup仅删除标签,而不删除内容

结论

BeautifulSoup可以像现代浏览器一样处理条件注释。这对于我的情况来说是完全可以的。