我一直在使用优秀的bleach库来删除糟糕的HTML。
我有一大堆从Microsoft Word中粘贴过来的HTML文档,包含如下内容:
<STYLE> st1:*{behavior:url(#ieooui) } </STYLE>
使用漂白剂(不允许使用style
标记),留给我的是:
st1:*{behavior:url(#ieooui) }
这是没有用的。漂白剂似乎只有以下选项:
- 逃生标签;
- 删除标签(但不包括其内容)。
我正在寻找第三个选项-删除标签和它们的内容。
是否有任何方法使用漂白剂或html5lib完全删除style
标签及其内容?html5lib的文档并没有提供多少帮助。
事实证明lxml
是完成这项任务的更好的工具:
from lxml.html.clean import Cleaner
def clean_word_text(text):
# The only thing I need Cleaner for is to clear out the contents of
# <style>...</style> tags
cleaner = Cleaner(style=True)
return cleaner.clean_html(text)
我能够使用基于以下方法的过滤器剥离标记的内容:https://bleach.readthedocs.io/en/latest/clean.html?highlight=strip#html5lib-filters-filters。它确实在输出中留下一个空的<style></style>
,但这是无害的。
from bleach.sanitizer import Cleaner
from bleach.html5lib_shim import Filter
class StyleTagFilter(Filter):
"""
https://bleach.readthedocs.io/en/latest/clean.html?highlight=strip#html5lib-filters-filters
"""
def __iter__(self):
in_style_tag = False
for token in Filter.__iter__(self):
if token["type"] == "StartTag" and token["name"] == "style":
in_style_tag = True
elif token["type"] == "EndTag":
in_style_tag = False
elif in_style_tag:
# If we are in a style tag, strip the contents
token["data"] = ""
yield token
# You must include "style" in the tags list
cleaner = Cleaner(tags=["div", "style"], strip=True, filters=[StyleTagFilter])
cleaned = cleaner.clean("<div><style>.some_style { font-weight: bold; }</style>Some text</div>")
assert cleaned == "<div><style></style>Some text</div>"