1

我对 Python 2.x 中的 unicode 感到非常困惑。

我正在使用 BeautifulSoup 抓取网页,并尝试将我找到的内容插入到字典中,名称为键,url 为值。

我正在使用 BeautifulSoup 的find功能来获取我需要的信息。我的代码开始如下:

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

这有效,除了从返回的thignfind是一个对象,而不是一个字符串。

事情开始让我感到困惑

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'

但是如果我尝试像这样访问字典的一个项目:

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')

或类似的。对于在 a 中使用,dict我会使用unicode()对象而不是编码。

要了解编码之间的区别unicode()以及str()使用什么编码,我建议您阅读Python Unicode HOWTO

于 2012-12-20T21:42:02.450 回答