我想从字符串中剥离所有html标记,除了我指定的一些标记。如果我用默认值调用构造函数,一切都很好:
>>> cleaner = lxml.html.clean.Cleaner()
>>> cleaner.clean_html('''<i>italic</i><script>alert('');</script>''')
'<span><i>italic</i></span>'
但当我试图指定一些标签时,事情就不起作用了:
>>> allowed_tags = ['i','s']
>>> cleaner = lxml.html.clean.Cleaner(remove_unknown_tags=False,allow_tags=allowed_tags)
>>> cleaner.clean_html('''<i>italic</i><s>strike</s>''')
'<span></span>'
那么我做错了什么?
作为一种变通方法,您可以将span
和div
标记添加到allowed_tags
中。
UPD
lxml.html.Cleaner
试图通过调用fromstring将字符串转换为html树,该函数检查文档是否有根节点,并在必要时添加它。因此,您需要允许span
和div
标记
这似乎是一个bug。我在lxml==2.3.3
版本中看不到它:
>>> from lxml.html import clean
>>> clean.clean_html('''<i>italic</i><script>alert('');</script>''')
'<span><i>italic</i></span>'
>>> c = clean.Cleaner(allow_tags='is', remove_unknown_tags=False)
>>> c.clean_html('''<i>italic</i><s>strike</s>''')
'<div><i>italic</i><s>strike</s></div>'