我是BeautifulSoup4中的UnicodeDammit模块的忠实粉丝,它将一个字符串牢牢地放在unicode中,并且还可以进行HTML unescaping:
from bs4 import UnicodeDammit
unicode_page = UnicodeDammit(raw_page, [suspected_encodings_if_any]).unicode_markup
有些情况下,即使强大的Dammit也会失败,并返回一个空字符串。对于那些情况,我希望对ascii有一些补偿。
Dammit使用chardet,所以没有必要退缩。 (Dammit还会寻找iconv_codec库 - 任何人都有使用它的经验吗?)什么是退回ascii的最好方法?这个尝试失去了东西,但似乎也有效:
def to_unicode_with_ascii_backoff(text):
if isinstance(text, unicode):
return text
else:
ud = UnicodeDammit(text).unicode_markup
if ud:
return ud
else:
return ''.join(i for i in text if ord(i) < 128)
答案 0 :(得分:1)
“最佳”取决于您的申请。你可以逐步改进你的功能:
def to_unicode_with_ascii_backoff(text):
u = UnicodeDammit(text).unicode_markup
return u if u or not text else text.decode('ascii', 'replace')
如果输入不是字节字符串或Unicode字符串,它总是返回Unicode字符串或引发错误。