在Python 2.7中保证unicode或ascii退避

时间:2013-04-05 21:44:42

标签: unicode python-2.7 character-encoding web-scraping

我是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)

1 个答案:

答案 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字符串或引发错误。