# -*- 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?
答案 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.