web-dev-qa-db-ja.com

Python文字列のHTMLエンティティをデコードしますか?

Beautiful Soup 3でHTMLを解析していますが、Beautiful Soup 3が自動的にデコードしないHTMLエンティティが含まれています。

>>> from BeautifulSoup import BeautifulSoup

>>> soup = BeautifulSoup("<p>&pound;682m</p>")
>>> text = soup.find("p").string

>>> print text
&pound;682m

textのHTMLエンティティをデコードして、"£682m"ではなく"&pound;682m"を取得するにはどうすればよいですか。

226
jkp

Python 3.4以降

HTMLParser.unescapeは非推奨であり、 .5で削除されることになっていた ですが、誤って残されていました。まもなく言語から削除されます。代わりに、html.unescape()を使用します。

import html
print(html.unescape('&pound;682m'))

https://docs.python.org/3/library/html.html#html.unescape を参照してください


Python 2.6-3.3

標準ライブラリのHTMLパーサーを使用できます。

>>> try:
...     # Python 2.6-2.7 
...     from HTMLParser import HTMLParser
... except ImportError:
...     # Python 3
...     from html.parser import HTMLParser
... 
>>> h = HTMLParser()
>>> print(h.unescape('&pound;682m'))
£682m

http://docs.python.org/2/library/htmlparser.html を参照してください

six 互換性ライブラリを使用してインポートを簡素化することもできます。

>>> from six.moves.html_parser import HTMLParser
>>> h = HTMLParser()
>>> print(h.unescape('&pound;682m'))
£682m
445
luc

Beautiful Soupはエンティティ変換を処理します。 Beautiful Soup 3では、convertEntities引数をBeautifulSoupコンストラクターに指定する必要があります(アーカイブされたドキュメントの 'Entity Conversion' セクションを参照)。 Beautiful Soup 4では、エンティティは自動的にデコードされます。

美しいスープ3

>>> from BeautifulSoup import BeautifulSoup
>>> BeautifulSoup("<p>&pound;682m</p>", 
...               convertEntities=BeautifulSoup.HTML_ENTITIES)
<p>£682m</p>

美しいスープ4

>>> from bs4 import BeautifulSoup
>>> BeautifulSoup("<p>&pound;682m</p>")
<html><body><p>£682m</p></body></html>
62
Ben James

W3lib.htmlライブラリのreplace_entitiesを使用できます

In [202]: from w3lib.html import replace_entities

In [203]: replace_entities("&pound;682m")
Out[203]: u'\xa3682m'

In [204]: print replace_entities("&pound;682m")
£682m
13
Corvax

Beautiful Soup 4を使用すると、 出力にフォーマッターを設定

formatter=Noneを渡すと、Beautiful Soupは出力時に文字列をまったく変更しません。これは最速のオプションですが、次の例のように、Beautiful Soupが無効なHTML/XMLを生成する可能性があります。

print(soup.prettify(formatter=None))
# <html>
#  <body>
#   <p>
#    Il a dit <<Sacré bleu!>>
#   </p>
#  </body>
# </html>

link_soup = BeautifulSoup('<a href="http://example.com/?foo=val1&bar=val2">A link</a>')
print(link_soup.a.encode(formatter=None))
# <a href="http://example.com/?foo=val1&bar=val2">A link</a>
2
LoicUV