2009-03-19 23 views
12

HTMLエンティティコード(たとえば&lt;&amp;)の文字列を通常の文字列(たとえば< &)に変換するPythonの簡単な方法を知っている人はいますか?HTMLエンティティコードをテキストに変換する

cgi.escape()は、文字列をエスケープします(不十分)が、unescape()はありません。

答えて

37

HTMLParserは、標準ライブラリの機能を備えています。

(Python2 Docs

>>> import HTMLParser 
>>> h= HTMLParser.HTMLParser() 
>>> h.unescape('alpha &lt; &beta;') 
u'alpha < \u03b2' 

(Pythonの3 Docs

>>> import html.parser 
>>> h = html.parser.HTMLParser() 
>>> h.unescape('alpha &lt; &beta;') 
'alpha < \u03b2' 

htmlentitydefs文書化されているのが、仕事を自分の多くを行うためにあなたを必要とします。それは、残念ながら、文書化されていません。

XML事前定義エンティティ(lt、gt、amp、quot、apos)のみが必要な場合は、minidomを使用してそれらを解析できます。あらかじめ定義されたエンティティと数字の文字参照を必要としない場合は、スピードのために単純な古い文字列置換を使用することもできます。

+1

+1 HTMLParserの機能がわかりません – vartec

+2

標準のライブラリから、エスケープされたHTMLコードを通常の文字列(http://docs.python.org/library/xml.sax)に変換する文書化された関数があります。 utils.html#xml.sax.saxutils.unescape –

+0

Python 3.4では、[documented](https://docs.python.org/3/library/html.html#html.unescape)です。 – 9000

1

htmlentitydefsモジュールを使用してください。この私の古いコードは、それが働いていたが、私はそれを行うには、よりクリーンで神託方法があると確信している:

e2c = dict(('&%s;'%k,eval("u'\\u%04x'"%v)) for k, v in htmlentitydefs.name2codepoint.items()) 
12

私が最初にそれをタグ付けするのを忘れ、私はBeautifulSoupを使用しています。マニュアルに周り掘り

は、私が見つかりました:

soup = BeautifulSoup(html, convertEntities=BeautifulSoup.HTML_ENTITIES) 

は私が望んでいたとおりにそれをしません。

+4

これは、BS4より前のBeautifulSoupバージョンでのみ機能します。 BS4を使用している場合は、フォーマッタを使用する必要があります。http://www.crummy.com/software/BeautifulSoup/bs4/doc/#output-formatters – kronion

+2

&の場合は機能しません。実際には、文字列に '&' 、BeautifulSoupはそれを&に変換します。これは私が望んでいたものの逆です。 –