HTMLで空白を入れるときに「 」というHTMLエンティティが使われるが、BeautifulSoupでスクレイピングすると文字化けする。これについて調べたことをまとめておく。
環境は以下の通り。
例えば、「This is <<&>>.(2つめの空白は )」と表示されるHTMLからBeautifulSoupで文字列を抽出してみると、「 」が「?」になる。「&(アンパサンド)」や「<(小なり)」は文字化けしないので、HTMLエンティティだからというわけではなさそう。
結果は以下の通り。
※表示するために「&」は全角にしてある。
BeautifulSoupのドキュメントを読むと、prettifyというHTMLの解析結果を整形表示するメソッドがあり、formatter="html"を指定すると解析結果のユニコードを可能なかぎりHTMLエンティティに変換してくれるらしい。
「 」が文字化けせずに表示される。
※表示するために「&」は全角にしてある。
スクレイピングするHTMLに「 」が使われているときは注意した方がよさそう。
環境は以下の通り。
例えば、「This is <<&>>.(2つめの空白は )」と表示されるHTMLからBeautifulSoupで文字列を抽出してみると、「 」が「?」になる。「&(アンパサンド)」や「<(小なり)」は文字化けしないので、HTMLエンティティだからというわけではなさそう。
#!/usr/bin/env python3 from bs4 import BeautifulSoup # 「This is <<&>>.」と表示されるHTML html = "<html><body>This is <<&>>.</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 <<&>>.</body></html>" soup = BeautifulSoup(html, "html.parser") print(soup.find("p").prettify(formatter="html"))
「 」が文字化けせずに表示される。
※表示するために「&」は全角にしてある。
スクレイピングするHTMLに「 」が使われているときは注意した方がよさそう。
0 件のコメント:
コメントを投稿