1. ホーム
  2. python

[解決済み] Python/Djangoを使用してHTMLデコード/エンコードを行うにはどうすればよいですか?

2022-05-09 07:28:18

質問

HTMLエンコードされた文字列があります。

'''<img class="size-medium wp-image-113"\
 style="margin-left: 15px;" title="su1"\
 src="http://blah.org/wp-content/uploads/2008/10/su1-300x194.jpg"\
 alt="" width="300" height="194" />'''

に変えたいんです。

<img class="size-medium wp-image-113" style="margin-left: 15px;" 
  title="su1" src="http://blah.org/wp-content/uploads/2008/10/su1-300x194.jpg" 
  alt="" width="300" height="194" /> 

これをHTMLとして登録し、ブラウザでテキストとして表示されるのではなく、画像としてレンダリングされるようにしたいのです。

というウェブスクレイピングツールを使っているので、このような文字列が保存されています。 BeautifulSoup これはウェブページをスキャンして特定のコンテンツを取得し、この形式の文字列を返します。

で行う方法を見つけました。 C# にはない。 Python . 誰か助けてくれませんか?

関連

どのように解決するのですか?

Django のユースケースを考えると、これには2つの答えがあります。 以下はその django.utils.html.escape 関数があります。

def escape(html):
    """Returns the given HTML with ampersands, quotes and carets encoded."""
    return mark_safe(force_unicode(html).replace('&', '&amp;').replace('<', '&l
t;').replace('>', '&gt;').replace('"', '&quot;').replace("'", '&#39;'))

これを逆手に取ると、Jakeの回答にあるCheetah関数が動作するはずですが、シングルクオートが抜けています。 このバージョンでは、対称性の問題を避けるために置換の順序を逆にした、更新されたタプルを含んでいます。

def html_decode(s):
    """
    Returns the ASCII decoded version of the given HTML string. This does
    NOT remove normal HTML tags like <p>.
    """
    htmlCodes = (
            ("'", '&#39;'),
            ('"', '&quot;'),
            ('>', '&gt;'),
            ('<', '&lt;'),
            ('&', '&amp;')
        )
    for code in htmlCodes:
        s = s.replace(code[1], code[0])
    return s

unescaped = html_decode(my_string)

しかし、これは一般的な解決策ではありません。 django.utils.html.escape . より一般的には、標準ライブラリにこだわるのがよいでしょう。

# Python 2.x:
import HTMLParser
html_parser = HTMLParser.HTMLParser()
unescaped = html_parser.unescape(my_string)

# Python 3.x:
import html.parser
html_parser = html.parser.HTMLParser()
unescaped = html_parser.unescape(my_string)

# >= Python 3.5:
from html import unescape
unescaped = unescape(my_string)

提案として、HTMLをエスケープせずにデータベースに保存する方がより理にかなっているかもしれません。 可能であれば、BeautifulSoupからエスケープされていない結果を取得し、このプロセスを完全に回避することを検討する価値があるでしょう。

Django では、エスケープはテンプレートのレンダリング中にしか行われません。したがって、エスケープを防ぐには、テンプレートエンジンに文字列をエスケープしないよう指示すればよいのです。 そのためには、テンプレートでこれらのオプションの一つを使います。

{{ context_var|safe }}
{% autoescape off %}
    {{ context_var }}
{% endautoescape %}