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