Beautiful Soup 3でHTMLを解析していますが、Beautiful Soup 3が自動的にデコードしないHTMLエンティティが含まれています。
>>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup("<p>£682m</p>")
>>> text = soup.find("p").string
>>> print text
£682m
text
のHTMLエンティティをデコードして、"£682m"
ではなく"£682m"
を取得するにはどうすればよいですか。
HTMLParser.unescape
は非推奨であり、 .5で削除されることになっていた ですが、誤って残されていました。まもなく言語から削除されます。代わりに、html.unescape()
を使用します。
import html
print(html.unescape('£682m'))
https://docs.python.org/3/library/html.html#html.unescape を参照してください
標準ライブラリの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('£682m'))
£682m
http://docs.python.org/2/library/htmlparser.html を参照してください
six
互換性ライブラリを使用してインポートを簡素化することもできます。
>>> from six.moves.html_parser import HTMLParser
>>> h = HTMLParser()
>>> print(h.unescape('£682m'))
£682m
Beautiful Soupはエンティティ変換を処理します。 Beautiful Soup 3では、convertEntities
引数をBeautifulSoup
コンストラクターに指定する必要があります(アーカイブされたドキュメントの 'Entity Conversion' セクションを参照)。 Beautiful Soup 4では、エンティティは自動的にデコードされます。
>>> from BeautifulSoup import BeautifulSoup
>>> BeautifulSoup("<p>£682m</p>",
... convertEntities=BeautifulSoup.HTML_ENTITIES)
<p>£682m</p>
>>> from bs4 import BeautifulSoup
>>> BeautifulSoup("<p>£682m</p>")
<html><body><p>£682m</p></body></html>
W3lib.htmlライブラリのreplace_entitiesを使用できます
In [202]: from w3lib.html import replace_entities
In [203]: replace_entities("£682m")
Out[203]: u'\xa3682m'
In [204]: print replace_entities("£682m")
£682m
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>