我已经把这个问题搞砸了几个小时,我似乎无法深究它。 我已经详细浏览了这个网站,虽然其他人似乎有类似的问题,但他们给出的解决方案对我不起作用。
我有一个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中声明。
我确信有一个简单的方法,但我找不到它。
感谢您的帮助。
答案 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样本吗?