Beautiful-soup-encoding

提供:Dev Guides
移動先:案内検索

美しいスープ-エンコーディング

すべてのHTMLまたはXMLドキュメントは、ASCIIやUTF-8などの特定のエンコーディングで記​​述されています。 ただし、そのHTML/XMLドキュメントをBeautifulSoupにロードすると、Unicodeに変換されます。

>>> markup = "<p>I will display £</p>"
>>> Bsoup = BeautifulSoup(markup)
>>> Bsoup.p
<p>I will display £</p>
>>> Bsoup.p.string
'I will display £'

上記の動作は、BeautifulSoupが内部的にUnicodeと呼ばれるサブライブラリを使用しているためです。Dammitはドキュメントのエンコーディングを検出し、それをUnicodeに変換します。

ただし、常にではなく、UnicodeのDammitが正しく推測します。 エンコーディングを推測するためにドキュメントがバイト単位で検索されるため、多くの時間がかかります。 from_encodingとしてBeautifulSoupコンストラクターにエンコードを渡すことでエンコードがわかっている場合は、時間を節約し、間違いを避けることができます。

以下は、BeautifulSoupが誤認する1つの例です。ISO-8859-8ドキュメントはISO-8859-7です。

>>> markup = b"<h1>\xed\xe5\xec\xf9</h1>"
>>> soup = BeautifulSoup(markup)
>>> soup.h1
<h1>νεμω</h1>
>>> soup.original_encoding
'ISO-8859-7'
>>>

上記の問題を解決するには、from_encodingを使用してBeautifulSoupに渡します-

>>> soup = BeautifulSoup(markup, from_encoding="iso-8859-8")
>>> soup.h1
<h1>ולש </h1>
>>> soup.original_encoding
'iso-8859-8'
>>>

BeautifulSoup 4.4.0から追加されたもう1つの新機能はexclude_encodingです。 正しいエンコーディングがわからないが、Unicodeであることを確認すると、Dammitが誤った結果を表示する場合に使用できます。

>>> soup = BeautifulSoup(markup, exclude_encodings=["ISO-8859-7"])

出力エンコーディング

BeautifulSoupへの入力ドキュメントに関係なく、BeautifulSoupからの出力はUTF-8ドキュメントです。 ポーランド語の文字がISO-8859-2形式であるドキュメントの下。

html_markup = """
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=iso-8859-2">
</HEAD>
<BODY>
ą ć ę ł ń ó ś ź ż Ą Ć Ę Ł Ń Ó Ś Ź Ż
</BODY>
</HTML>
"""


>>> soup = BeautifulSoup(html_markup)
>>> print(soup.prettify())
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
   <head>
      <meta content="text/html; charset=utf-8" http-equiv="content-type"/>
   </head>
   <body>
      ą ć ę ł ń ó ś ź ż Ą Ć Ę Ł Ń Ó Ś Ź Ż
   </body>
</html>

上記の例では、<meta>タグが書き直され、BeautifulSoupから生成されたドキュメントがUTF-8形式になっていることを反映しています。

UTF-8で生成された出力が不要な場合は、prettify()で目的のエンコーディングを割り当てることができます。

>>> print(soup.prettify("latin-1"))
b'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">\n<html>\n <head>\n <meta content="text/html; charset=latin-1" http-equiv="content-type"/>\n </head>\n <body>\n ą ć ę ł ń \xf3 ś ź ż Ą Ć Ę Ł Ń \xd3 Ś Ź Ż\n </body>\n</html>\n'

上記の例では、ドキュメント全体をエンコードしましたが、スープ内の特定の要素は、Python文字列であるかのようにエンコードできます-

>>> soup.p.encode("latin-1")
b'<p>0My first paragraph.</p>'
>>> soup.h1.encode("latin-1")
b'<h1>My First Heading</h1>'

選択したエンコーディングで表現できない文字は、数値のXMLエンティティ参照に変換されます。 以下はそのような例の1つです-

>>> markup = u"<b>\N{SNOWMAN}</b>"
>>> snowman_soup = BeautifulSoup(markup)
>>> tag = snowman_soup.b
>>> print(tag.encode("utf-8"))
b'<b>\xe2\x98\x83</b>'

上記を「latin-1」または「ascii」でエンコードしようとすると、「☃」が生成され、その表現がないことを示します。

>>> print (tag.encode("latin-1"))
b'<b>☃</b>'
>>> print (tag.encode("ascii"))
b'<b>☃</b>'

Unicode、Dammit

Unicode、Dammitは主に、受信ドキュメントが不明な形式(主に外国語)であり、既知の形式(Unicode)でエンコードする場合に使用されます。また、これらすべてを実行するためにBeautifulsoupは必要ありません。