两个都是unicode,但比较时,它不起作用?

时间:2016-10-03 02:30:06

标签: python unicode

# -*- coding: utf-8 -*- 
from bs4 import  BeautifulSoup 
import urllib2

response = urllib2.urlopen('http://bbs.szhome.com/80300-0-0-0-3005.html')
html = response.read()

soup = BeautifulSoup(html)

returntext = soup.find('dl',class_='fix').text 
print returntext

if isinstance(returntext,unicode):
    print 'ok1' #true,print ok1

text = u'暂无相关数据...'

if isinstance(text,unicode):
    print 'ok2' #true,print ok2

text2 = '暂无相关数据...'
if isinstance(text2,str):
    print 'ok3' #true,print ok3

if returntext == text:
    print 'ok4' #both unicode,but not excute,why?

2 个答案:

答案 0 :(得分:1)

在比较之前,您需要strip所有新行:

>>> print returntext

暂无相关数据...

>>> print text
暂无相关数据...
>>> returntext
u'\n\u6682\u65e0\u76f8\u5173\u6570\u636e...\n'
>>> text
u'\u6682\u65e0\u76f8\u5173\u6570\u636e...'
>>> returntext.strip() == text
True

答案 1 :(得分:0)

它们不是unicode,它们只是看起来那样,因为你的显示器为你解码text2。事实上,isinstance(text2,str)表明text2显然是一个字符串,而不是unicode。

Unicode用螺栓连接到python 2上,它的用法有点奇怪。 str可以保存任何八位字节(通常是ascii字符,但是二进制二进制数据),在您的情况下,它包含字符串的utf-8编码版本。

text是unicode,有9个字符

>>> text = u'暂无相关数据...'
>>> type(text), len(text)
(<type 'unicode'>, 9)

Text2是字符串中的二进制blob,有21个八位字节,与text

不同
>>> text2 = '暂无相关数据...'
>>> type(text2), len(text2)
(<type 'str'>, 21)
>>> text == text2
__main__:1: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
False

但我可以将其解码为unicode并进行比较

>>> text2_unicode = text2.decode('utf-8')
>>> type(text2_unicode), len(text2_unicode)
(<type 'unicode'>, 9)
>>> text == text2_unicode
True

这一切在python 3中运行得更好,更清晰。如果可以避免,你不应该使用2.x.