Python编码UnicodeDecodeError

时间:2011-11-10 22:28:14

标签: python character-encoding

我已经把这个问题搞砸了几个小时,我似乎无法深究它。 我已经详细浏览了这个网站,虽然其他人似乎有类似的问题,但他们给出的解决方案对我不起作用。

我有一个python脚本,它读取网站的HTML并使用漂亮的汤来查找头部,正文,H1等等...然后将它们存储在utf-8 MySQL表中。

似乎直截了当但我仍然遇到:

UnicodeDecodeError: 'ascii' codec can't decode byte xxxxxx

当我编码时。我已经尝试了所有我能找到的东西来阻止这种情况发生但无济于事。 这是代码的一个版本:

soup = BeautifulSoup(strIndexPage)
strIndexPageBody = str(soup.body)
strIndexPageBody = strIndexPageBody.encode('ascii', 'ignore') # I know ignore is not best practice but I am really not interested in anything outside the ascii character set
strIndexPageBody = strIndexPageBody .replace('"','"')
strIndexPageBody = strIndexPageBody .replace("'","&rsquo")

我尝试转换为utf-8的早期版本效果更好,但我最终得到了

` 

某些HTML中存在的字符会破坏MySQL的插入/更新。 显然我已经尝试搜索这个字符并替换它,但是python告诉我在我的代码中有一个非ascii字符!

我读过很多文章,说我应首先查看HTML的编码,解码然后编码以适应,但编码并不总是从BS返回,和/或不在HTML中声明。

我确信有一个简单的方法,但我找不到它。

感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

请注意,您从编码调用中收到 decode 错误。这是Python 2中最丑陋的部分:它允许您尝试编码已经编码的字符串,首先将其解码为ascii。你正在做的是等同于:

s.decode('ascii', 'strict').encode('ascii', 'ignore')

我认为这应该符合您的期望:

soup = BeautifulSoup(strIndexPage)
strIndexPageBody = unicode(soup.body)
strIndexPageBody = strIndexPageBody.encode('ascii', 'ignore')

请注意,我们正在调用unicode,因此我们获得了一个可以有效尝试编码的unicode字符串。

答案 1 :(得分:2)

即使未指定文档,BeautifulSoup的UnicodeDammit也应该能够检测到文档的编码。

当您在相关页面上运行此操作时会发生什么?:

from BeautifulSoup import UnicodeDammit

UnicodeDammit(html_string).unicode

什么特定的代码行引发错误,我们可以提供有问题的HTML样本吗?