我有一个脚本循环遍历数据库并对字符串进行一些漂亮的处理,同时用其他文本替换一些文本等。
这大部分时间都是100%工作,但是有些html blob似乎包含unicode文本,这会破坏脚本并出现以下错误:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 112: ordinal not in range(128)
我不知道在这种情况下该怎么做,有没有人知道一个模块/函数来强制字符串中的所有文本都是标准化的utf-8或其他东西?
数据库中的所有html blob都来自feedparser(下载rss feed,存储在db中)。
答案 0 :(得分:1)
由于您不想向我们展示您的代码,我将给出一个通用答案,希望能帮助您找到问题。
当您首次从数据库中获取数据并使用fetchone
获取数据时,需要将其转换为unicode
对象。一旦有了变量,最好立即执行此操作,然后仅在输出变量时对其进行重新编码。
db = MySQLdb.connect()
cur = db.cursor()
cur.execute("SELECT col FROM the_table LIMIT 10")
xml = cur.fetchone()[0].decode('utf-8') # Or whatever encoding the text is in, though we're pretty sure it's utf-8. You might use chardet
运行xml
到BeautifulSoup
之后,如果将字符串保存到文件中,您可能会再次encode
字符串,或者如果您要将其保留为Unicode对象 - 将其插入数据库。
答案 1 :(得分:1)
确保您真正了解unicode和UTF-8之间的区别,并且它不相同(许多人都感到惊讶)。那是The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets
您的数据库的编码是什么?它真的是UTF-8还是你只是假设它是?如果它包含带随机编码的blob,那么你有问题,因为你cannot guess the encoding。当您从数据库中读取时,然后decode
将blob解码为unicode,并在代码中稍后使用unicode。
但是假设你的基础是UTF-8。然后你应该使用unicode everywhere - decode early, encode late。在程序内部的任何地方使用unicode,只在读取或写入数据库,显示,写入文件等时进行解码/编码。
Python 2.x中的Unicode和编码有点痛苦,幸运的是在python 3中all text is unicode
关于BeautifulSoup,请使用最新的version 4。
答案 2 :(得分:1)
经过几个小时的谷歌搜索,我终于遇到了一个消除所有解码错误的解决方案。我还是相当新的python(沉重的PHP背景)并且不理解字符编码。
在我的代码中,我有一个.decode('utf-8'),之后有一些.replace(str(beatiful_soup_tag),'')语句。解决方案最终变得如此简单,以至于将所有str()更改为unicode()。在那之后,没有一个问题。
答案发现于: http://ubuntuforums.org/showthread.php?t=1212933
我真诚地向那些要求我发布代码的评论者道歉,我认为是坚如磐石而不是问题恰恰相反,我相信他们会马上发现这个问题!我不会再犯这个错误了! :)
答案 3 :(得分:1)
在使用字符串变量进行任何进一步处理之前:
clean_str = unicode(str_var_with_strange_coding, errors='ignore')
跳过乱糟糟的字符。不优雅,因为你不试图恢复任何可能有意义的值,但有效。