1

我是 BeautifulSoup4 中 UnicodeDammit 模块的忠实拥护者,它把一个字符串牢牢地放在 unicode 中,并且还做了 HTML 反转义:

from bs4 import UnicodeDammit
unicode_page = UnicodeDammit(raw_page, [suspected_encodings_if_any]).unicode_markup

但是,在某些情况下,即使是强大的 Dammit 也会失败,并返回一个空字符串。对于这些情况,我希望对 ascii 进行某种退避。

Dammit 使用 chardet,所以没有必要放弃这一点。(该死的还寻找 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)
4

1 回答 1

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

于 2013-04-10T20:29:19.893 回答