Beautifle Soupは与えられたドキュメントをUnicodeに変換して、内部的にはUnicode文字列として保持します。
from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup( "Nekoya" )
print soup.contents[0] # u'Nekoya'
print soup.originalEncoding # 'ascii'
上記の例では、ASCIIコードからなるドキュメントを読み込みます(2行目)。それを3行目で読み出すときにはUnicode文字列として取り出されます。4行目でoriginalEncodingメソッドを使ってもとのドキュメントの文字コードを調べると、Beautifl Soupに取り込む前の文字コードはASCIIだったことが分かります。
本来はこのようにBeautifl Soupでは文字コードの違いをあまり意識せずに、Unicode文字列として扱えばいいはずなのですが、変換する前の文字コードの判別が不完全なことがしばしばあるようです。そのためには、BeautifulSoup関数のfromEncodingオプジョンを使ってドキュメントソースの文字コードを明示的に指定します。以下はShift-JISのHTMLドキュメントをBeautifl Soupに取り込んで(8行目)、10行目で表示しますが、10行目ではUnicode文字列として取得されます。12行目でオリジナルの文字コードはShift-JISであったことが分かります。
#coding: UTF-8
from BeautifulSoup import BeautifulSoup
#euc
#soup = BeautifulSoup( "\xa4\xb3\xa4\xec\xa4\xcf", fromEncoding="euc-jp" )
#sjis
soup = BeautifulSoup( u"ねこや書店".encode('shift-jis'), fromEncoding="shift-jis" )
print str(soup)
print "soup.originalEncoding", soup.originalEncoding