2017年7月23日日曜日

PythonライブラリのBeautifulSoupで空白HTMLエンティティが文字化けする

HTMLで空白を入れるときに「 」というHTMLエンティティが使われるが、BeautifulSoupでスクレイピングすると文字化けする。これについて調べたことをまとめておく。

環境は以下の通り。



例えば、「This is <<&>>.(2つめの空白は&nbsp;)」と表示されるHTMLからBeautifulSoupで文字列を抽出してみると、「&nbsp;」が「?」になる。「&amp;(アンパサンド)」や「&lt;(小なり)」は文字化けしないので、HTMLエンティティだからというわけではなさそう。

#!/usr/bin/env python3
from bs4 import BeautifulSoup

# 「This is <<&>>.」と表示されるHTML
html = "<html><body>This is&nbsp;&lt;&lt;&amp;&gt;&gt;.</body></html>"
soup = BeautifulSoup(html, "html.parser")

print(soup.find("p"))

結果は以下の通り。

※表示するために「&」は全角にしてある。

BeautifulSoupのドキュメントを読むと、prettifyというHTMLの解析結果を整形表示するメソッドがあり、formatter="html"を指定すると解析結果のユニコードを可能なかぎりHTMLエンティティに変換してくれるらしい。
If you pass in formatter="html", Beautiful Soup will convert Unicode characters to HTML entities whenever possible:
上のsample.pyのHTMLをprettify(formatter="html")を使って表示してみる。

#!/usr/bin/env python3
from bs4 import BeautifulSoup

# 「This is <<&>>.」と表示されるHTML
html = "<html><body>This is&nbsp;&lt;&lt;&amp;&gt;&gt;.</body></html>"
soup = BeautifulSoup(html, "html.parser")

print(soup.find("p").prettify(formatter="html"))

「&nbsp;」が文字化けせずに表示される。

※表示するために「&」は全角にしてある。

スクレイピングするHTMLに「&nbsp;」が使われているときは注意した方がよさそう。

0 件のコメント:

コメントを投稿