を介して美しいスープ ライブラリを使用して、Web ページからリンクを取得しますa.get('href')
。リンク先に変な文字®
がありますが、手に入れたら になりまし®
た。どうすれば正しくエンコードできますか?私はすでにページの先頭に追加しました# -*- coding: utf-8 -*-
r = requests.get(url)
soup = BeautifulSoup(r.text)
を介して美しいスープ ライブラリを使用して、Web ページからリンクを取得しますa.get('href')
。リンク先に変な文字®
がありますが、手に入れたら になりまし®
た。どうすれば正しくエンコードできますか?私はすでにページの先頭に追加しました# -*- coding: utf-8 -*-
r = requests.get(url)
soup = BeautifulSoup(r.text)
使用しないでください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 にはエンコーディングを自動検出する他の方法が含まれています。