使用bs4从html邮件中删除可疑注释。现在,我遇到了类型为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',
小b也应删除。问题是,bs4将第一个注释检测为一个单个注释对象,但是将第二个注释检测为3个对象。 Comment(if),NavigableString(b)和Comment(endif)。提取仅删除两种注释类型。内容为“ b”的NavigableString保留在DOM中。
对此有什么解决办法?
答案 0 :(得分:0)
经过一段时间阅读有关条件注释的信息,我可以理解为什么会这样发生。
downlevel-hidden
基本上写为普通注释<!-- ... -->
。在现代浏览器中,这被检测为条件注释块。因此,如果我想删除条件注释,BeautifulSoup会将其完全删除。
downlevel-revealed
被写为<!...>b<!...>
,现代浏览器将这两个标记检测为无效并在DOM中忽略它们,因此仅b
仍然有效。因此BeautifulSoup仅删除标签,而不删除内容
BeautifulSoup可以像现代浏览器一样处理条件注释。这对于我的情况来说是完全可以的。