つくったわけ
一般ユーザ(大体は管理者だと思いますが)に対して、リッチテキストエディタを組み込んだ画面を提供してHTMLタグ込みの文章を入力可能としているシステムは多く存在しますよね。
ああいう感じの画面があるシステムを作っていたんですが、そのシステムの特性として、ひとつひとつの文章はそんなに長くないかわりに、文章数が多くなってしまいそうな予感がありました。
その時に「CSVインポートできたらおしゃれよなぁ・・・」と思い検索したものの、google先生に嫌われているのか、しっくりくるものを見つけられなかったので、つくりました。
(何かいいものがあってご存じの方は是非教えてください)
(2019/8/24追記)
エラーにしたかったので、「バリデーター」でばっかり検索してたので見つかりませんでしたが、「サニタイザー」で検索したら、より高機能なものがありました。
これ(bleach) や これ(html-sanitizer)です。
今回作ったものは、シンプル、かつ作者が日本人ということで、そこに魅力を感じたらお使いください。。。
できること
処理対象の文字列に任意の「HTMLタグ-属性」が存在するかをチェックすることができます。
つまり
<a href='~'>リンク</a> → OK
<a onclick='~'>リンク</a> → NG
とすることが可能です。
やったね!お疲れさま!README読んで使ってね!
では記事にならないので、簡単に使い方を解説しようかと思います。
はうつー
インストール
pip install custom_html_validator
使い方
from custom_html_validator import CustomHTMLValidater
def main():
# 許可する任意のタグ・属性の組み合わせ
ALLOWED_TAGS = {
# 'tag': ['attr1','attr2']
'a':['href',''],
'br':[]
}
# 処理対象の文字列
target_str = '<a href = "xxx">link</a>'
# 初期化と、許可するタグの設定
parser = CustomHTMLValidater()
# 設定しなければすべてのHTMLタグ・属性がNG扱い
parser.set_allowed_tags(ALLOWED_TAGS)
# 処理対象文字列のチェック
parser.feed(target_str)
results = parser.close()
# チェック結果の確認例
if results['status'] == 1:
# チェックOK
elif results['status'] == -1:
# チェックNG
# results['detail'] にエラーの理由の文章が格納されている
next_str = '<b>晩飯食べにいく約束ドタキャンされたのでこの記事かいてる</b>'
# 閉じタグのチェック処理の関係から、別の文字列をチェックするときはリセットが必要
# 許可するタグリストは初期化されない
parser.reset()
# 許可するタグリストも初期化する場合はこっち
parser.reset(True)
もしひとつのHTMLドキュメントが複数のStringに分かれて格納されるような感じなら、close()をするまえに、別のStringをfeed()すれば、たぶん大丈夫なはずです。
だめだったら、parserに食わせる文字列のほうを加工してください・・・
ちなみに
テストをして大丈夫だと思ってるのは以下のパターンです。不足や変な挙動をとるものを発見した場合は教えてください...
- 単純な許可する/しない のタグ・属性セットがそれぞれ/どちらも含まれるパターン
- 開始/終了タグが存在しないパターン
- HTML構造がおかしいパターン(
<div><b>ミネソタ優勝</div><a>
みたいな) - 空タグ系のHTML/XHTMLの形式(
<br>
<br />
)
モジュールの中身も軽く触れる予定でしたが、apexやりたくなってきたので、いったんおわります。
質問やらバグやらあればお気軽にコメントいただけると幸いです!