<
&
Python で HTML エンティティ コード (例: ) を含む文字列を通常の文字列 (例: < &)に変換する簡単な方法を知っている人はいますか?
cgi.escape()
は文字列を (不十分に) エスケープしますが、. はありませんunescape()
。
<
&
Python で HTML エンティティ コード (例: ) を含む文字列を通常の文字列 (例: < &)に変換する簡単な方法を知っている人はいますか?
cgi.escape()
は文字列を (不十分に) エスケープしますが、. はありませんunescape()
。
HTMLParserは、標準ライブラリに機能があります。残念ながら、文書化されていません。
(Python2ドキュメント)
>>> import HTMLParser
>>> h= HTMLParser.HTMLParser()
>>> h.unescape('alpha < β')
u'alpha < \u03b2'
(Python 3ドキュメント)
>>> import html.parser
>>> h = html.parser.HTMLParser()
>>> h.unescape('alpha < β')
'alpha < \u03b2'
htmlentitydefsは文書化されていますが、自分で多くの作業を行う必要があります。
XML 定義済みエンティティ (lt、gt、amp、quot、apos) のみが必要な場合は、minidom を使用してそれらを解析できます。事前定義されたエンティティのみが必要で、数字参照が必要ない場合は、単純な古い文字列置換を使用して速度を上げることもできます。
最初にタグ付けするのを忘れていましたが、BeautifulSoup を使用しています。
ドキュメントを調べてみると、次のことがわかりました。
soup = BeautifulSoup(html, convertEntities=BeautifulSoup.HTML_ENTITIES)
私が望んでいたとおりにそれを行います。
HTML をアンエスケープするための Python stdlib には何も組み込まれていませんが、必要に応じて調整できる短いスクリプトがhttp://www.w3.org/QA/2008/04/unescape-html-entities-python .html にあります。
htmlentitydefsモジュールを使用します。これは私の古いコードですが、うまくいきましたが、よりクリーンでよりpythonicな方法があると確信しています:
e2c = dict(('&%s;'%k,eval("u'\\u%04x'"%v)) for k, v in htmlentitydefs.name2codepoint.items())