3

を介して美しいスープ ライブラリを使用して、Web ページからリンクを取得しますa.get('href')。リンク先に変な文字®がありますが、手に入れたら になりまし®た。どうすれば正しくエンコードできますか?私はすでにページの先頭に追加しました# -*- coding: utf-8 -*-

r = requests.get(url)

soup = BeautifulSoup(r.text)
4

1 に答える 1

5

使用しないでくださいr.text。デコードを次のようにしBeautifulSoupます。

soup = BeautifulSoup(r.content)

r.contentデコードせずに、バイト単位で応答を返します。r.text一方、 は にデコードされた応答unicodeです。

何が起こるかというと、サーバーが応答ヘッダーに文字セットを含めていないということです。その時点でrequestsは、HTTP RFC 2261 のセクション 3.7.1に従います。デフォルトtext/では、応答は ISO-8859-1 (Latin 1) 文字セットを使用することが期待されます。

あなたの HTML ページでは、そのデフォルトが間違っているため、間違った結果が得られました。r.textバイトを Latin-1 としてデコードした結果、Mojibakeが生成されました。

>>> print u'®'.encode('utf8').decode('latin1')
®

HTML 自体は、HTML ヘッダー内のタグの形式で、HTML ページ自体に正しいエンコーディングを含めることができます。BeautifulSoup はそのヘッダーを使用してバイトをデコードします。<meta>

ヘッダー タグがない場合でも<meta>、BeautifulSoup にはエンコーディングを自動検出する他の方法が含まれています。

于 2014-07-16T21:05:53.383 に答える