Python 2.7中保证的unicode或ascii回退

Python 2.7中保证的unicode或ascii回退,unicode,python-2.7,character-encoding,web-scraping,Unicode,Python 2.7,Character Encoding,Web Scraping,我非常喜欢BeautifulSoup4中的UnicodeAMMIT模块,它将一个a字符串牢牢地放在unicode中,并且还可以实现HTML的无缝转换: from bs4 import UnicodeDammit unicode_page = UnicodeDammit(raw_page, [suspected_encodings_if_any]).unicode_markup 但是,在某些情况下,即使是强大的Dammit也会失败,并返回一个空字符串。我想在这些情况下对ascii进行某种退避 D

我非常喜欢BeautifulSoup4中的UnicodeAMMIT模块,它将一个a字符串牢牢地放在unicode中,并且还可以实现HTML的无缝转换:

from bs4 import UnicodeDammit
unicode_page = UnicodeDammit(raw_page, [suspected_encodings_if_any]).unicode_markup
但是,在某些情况下,即使是强大的Dammit也会失败,并返回一个空字符串。我想在这些情况下对ascii进行某种退避

Dammit使用chardet,因此没有理由放弃它。(Dammit也在寻找iconv_编解码器库——有没有人有过这方面的经验?)?这种尝试虽然失败了,但似乎也奏效了:

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)
def to_unicode_和_ascii_回退(文本):
如果isinstance(文本,unicode):
返回文本
其他:
ud=unicode数据格式(文本).unicode\u标记
如果ud:
返回ud
其他:
返回“”。连接(如果ord(i)<128,则文本中的i表示i)
“最佳”取决于您的应用程序。您可以逐步改进您的功能:

def to_unicode_with_ascii_backoff(text):
    u = UnicodeDammit(text).unicode_markup
    return u if u or not text else text.decode('ascii', 'replace')
如果输入不是bytestring或Unicode字符串,它总是返回Unicode字符串或引发错误

“最佳”取决于您的应用程序。您可以逐步改进您的功能:

def to_unicode_with_ascii_backoff(text):
    u = UnicodeDammit(text).unicode_markup
    return u if u or not text else text.decode('ascii', 'replace')

如果输入不是bytestring或Unicode字符串,它总是返回Unicode字符串或引发错误

字符集检测无法可靠地完成-如果故障指的是这些情况,则您无能为力。为响应上述注释,添加了退避位,谢谢。
unicodemamit
可以在内部使用
chardet
(如果可用)。UnicodeAmmit的HTML ism示例有哪些
bytestring.decode(编码)
足以获得Unicode字符串(无需多次编码/解码)。使用
isinstance(s,unicode)
代替
类型为unicode
。使用bytestring调用
unicodedata.normalize()
是一个错误。@J.F.Sebastian:为了回应您的评论,进行了大量编辑,谢谢。我误读了该死的代码,认为它只适用于包含HTML实体的字符串(它所做的是处理HTML化字符到常规字符的转换,如果它们存在的话)。字符集检测无法可靠地完成-如果失败是指这些情况,那你就无能为力了。为了回应上面的评论,添加了退避位,谢谢。
unicodemammit
可以在内部使用
chardet
。UnicodeAmmit的HTML ism示例有哪些
bytestring.decode(编码)
足以获得Unicode字符串(无需多次编码/解码)。使用
isinstance(s,unicode)
代替
类型为unicode
。使用bytestring调用
unicodedata.normalize()
是一个错误。@J.F.Sebastian:为了回应您的评论,进行了大量编辑,谢谢。我误读了该死的代码,认为它只适用于包含HTML实体的字符串(它所做的是处理HTML化字符到常规字符的转换,如果它们存在的话)。继续感谢-从中学到了很多。还发现了在必要时从unicode优雅地转换为ascii。最后需要删除控制字符,方法是在我的原始最后一行添加
if
,以检查
bad_chars=frozenset([0,1,2,3,4,5,6,7,8,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31])
@CharlesS.:注意:0x7f也是C控制字符继续感谢-从中学到了很多。还发现了在必要时从unicode优雅地转换为ascii。最后需要删除控制字符,方法是在我的原始最后一行添加一个
if
,以检查
bad_chars=frozenset([0,1,2,3,4,5,6,7,8,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31])
@CharlesS.:注意:0x7f也是C控制字符