Python 编码 UnicodeDecodeError

1 投票
2 回答
2000 浏览
提问于 2025-04-17 06:04

我已经花了好几个小时在这个问题上,但就是搞不明白。 我仔细看过这个网站,虽然其他人似乎也遇到类似的问题,但他们给出的解决方案对我来说都没用。

我有一个Python脚本,它可以读取一个网站的HTML,然后用Beautiful Soup这个工具来找到像头部、主体、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的编码,解码后再编码成合适的格式,但编码有时候从Beautiful Soup那里得不到,或者在HTML中没有声明。

我相信有简单的方法可以解决这个问题,但我就是找不到。

谢谢大家的帮助。

2 个回答

2

BeautifulSoup的 UnicodeDammit 功能可以在文档没有明确指定编码时,自动检测文档的编码方式。

当你在相关页面上运行这个代码时,会发生什么呢?:

from BeautifulSoup import UnicodeDammit

UnicodeDammit(html_string).unicode

具体是哪个代码行出现了错误?能否提供一段有问题的HTML示例?

6

注意,你遇到的这个 解码 错误是因为你在进行编码时出错了。这是Python 2中最让人头疼的部分:它允许你尝试对一个已经编码过的字符串进行编码,方法是先把它解码为ascii格式。你现在的操作就相当于这样:

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

我觉得这样做应该能达到你想要的效果:

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

要注意,我们在调用unicode,这样我们就能得到一个有效的unicode字符串,然后可以安全地进行编码。

撰写回答