1

私はPython2.xのUnicodeについて非常に混乱しています。

私はBeautifulSoupを使用してWebページをスクレイプし、見つけたものを名前をキー、URLを値として辞書に挿入しようとしています。

BeautifulSoupのfind関数を使用して必要な情報を取得しています。私のコードは次のように始まりました:

name = i.find('a').string
url = i.find('a').get('href')

findこれは、文字列ではなくオブジェクトから返されるthignを除いて、機能します。

これが私を混乱させ始めたものです

str変数に割り当てる前にタイプに変換しようとすると、がスローされることがありUnicodeEncodeErrorます。

'ascii' codec can't encode character u'\xa0' in position 5: ordinal not in range(128)

私はグーグルで周りにエンコードする必要があることがわかりましたascii

追加してみます:

print str(i.find('a').string).encode('ascii', 'ignore')

運が悪いですが、それでもUnicodeエラーが発生します。

そこから、を使ってみreprました。

print repr(i.find('a').string)

そしてそれはうまくいきます...ほとんど!

ここで新しい問題が発生しました。

すべてが言われ、行われ、辞書が作成されると、私は何にも血まみれにアクセスできなくなります!それは私にを与え続けますKeyError

私は口述をループすることができます:

for i in sorted(data.iterkeys()):
    print i


>>> u'Key1'
>>> u'Key2'
>>> u'Key3'
>>> u'Key4'

しかし、私がこのようなdictのアイテムにアクセスしようとすると:

print data['key1']

また

print data[u'key1']

また

test = unicode('key1')
print data[test]

それらはすべてKeyErrorsを返しますが、これは私にとって100%混乱しています。それらがUnicodeオブジェクトであることに関係があると思います。

私は思いついたすべてのことを試しましたが、何が起こっているのか理解できません。

おー!奇妙なことに、このコードは次のとおりです。

name = repr(i.find('a').string)
print type(name)

戻り値

>>> type(str)

でも私が物を印刷するだけなら

print name

Unicode文字列として表示されます

>>>> u'string name' 
4

1 に答える 1

3

.string値は確かに文字列ではありません。あなたはそれをにキャストする必要がありますunicode()

name = unicode(i.find('a').string)

これは、と呼ばれるUnicodeのようなオブジェクトNavigableStringです。代わりに本当に必要なstr場合は、そこからエンコードできます。

name = unicode(i.find('a').string).encode('utf8')

または類似。で使用する場合は、オブジェクトをdict使用し、unicode()エンコードはしません。

との違いunicode()str()使用するエンコーディングを理解するには、 PythonUnicodeHOWTOを読むことをお勧めします。

于 2012-12-20T21:42:02.450 に答える