使用 html5lib 或漂白剂删除 <style>...</style> 标记的内容



我一直在使用优秀的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>"

相关内容

  • 没有找到相关文章

最新更新