5

私は悪いHTMLを削除するために優れたブリーチライブラリを使用してきました。

Microsoft Wordから貼り付けられたHTMLドキュメントがたくさんあり、次のようなものが含まれています。

<STYLE> st1:*{behavior:url(#ieooui) } </STYLE>

ブリーチを使用すると(styleタグは暗黙的に禁止されています)、次のようになります。

st1:*{behavior:url(#ieooui) }

これは役に立ちません。ブリーチには次のオプションしかないようです。

  • タグをエスケープします。
  • タグを削除します(ただし、その内容は削除しません)。

3番目のオプションを探しています-タグとその内容を削除します。

ブリーチまたはhtml5libを使用してstyleタグとその内容を完全に削除する方法はありますか?html5libのドキュメントは、それほど役に立ちません。

4

2 に答える 2

7

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)
于 2011-09-24T21:00:39.643 に答える
1

このアプローチに基づくフィルターを使用して、タグの内容を取り除くことができました: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>"
于 2021-05-27T23:15:38.040 に答える