1

我有一个脚本,它遍历数据库并对字符串进行一些漂亮的处理,以及用其他文本替换一些文本等。

这在大多数情况下 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 中)。

4

4 回答 4

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 对象。

于 2013-01-12T13:50:07.297 回答
1

经过几个小时的谷歌搜索,我终于找到了一个消除所有解码错误的解决方案。我对 python 还是很陌生(沉重的 php 背景)并且不了解字符编码。

在我的代码中,我有一个 .decode('utf-8') ,然后做了一些 .replace(str(beatiful_soup_tag),'') 语句。解决方案最终变得如此简单,以至于将所有 str() 更改为 unicode()。在那之后,没有一个问题。

答案在: http ://ubuntuforums.org/showthread.php?t=1212933

我真诚地向要求我发布代码的评论者道歉,我认为是坚如磐石的,而不是问题恰恰相反,我相信他们会立即发现问题!我不会再犯那个错误了!:)

于 2013-01-12T16:52:23.940 回答
1

在对字符串变量进行任何进一步处理之前:

clean_str = unicode(str_var_with_strange_coding, errors='ignore')

乱七八糟的字符被跳过。不优雅,因为您不会尝试恢复任何可能有意义的值,但有效。

于 2013-01-12T17:07:19.980 回答
1

确保您真正了解unicodeUTF-8之间的区别,并且它们不一样(这让许多人感到惊讶)。这是每个软件开发人员绝对、肯定必须了解 Unicode 和字符集的绝对最低要求

您的数据库的编码是什么?它真的是 UTF-8 还是你只是假设它是?如果它包含带有随机编码的 blob,那么您就有问题,因为您无法猜测编码。当您从数据库中读取时,然后decode将 blob 转换为 unicode 并稍后在您的代码中使用 unicode。

但是假设您的基础是 UTF-8。然后你应该在任何地方使用 unicode - 早解码,晚编码。在程序中的任何地方都使用 unicode,并且仅在读取或写入数据库、显示、写入文件等时解码/编码。

Unicode 和编码在 Python 2.x 中有点痛苦,幸运的是在 Python 3 中所有文本都是 unicode

关于 BeautifulSoup,请使用最新版本 4

于 2013-01-12T13:55:45.303 回答