Python爬虫出现unicode错误

-3 投票
3 回答
4129 浏览
提问于 2025-04-18 16:16
res = requests.get(self.urlBase)
soup = BeautifulSoup(html)
print soup.prettify()

出现了这个错误:

'ascii' 编码无法在位置 10816 编码字符 u'\xa0': 序号不在范围内(128)

我正在使用 Requests 和 BeautifulSoup4。

我猜这可能和 Unicode 有关?我看到的每一个例子都是这样用的,没有问题。不知道为什么我的编码会出问题?

内容类型是 text/html; charset=UTF-8

3 个回答

1

你说得对,这个问题和Unicode有关。简单来说,就是有些字符不能直接在命令行上打印出来,因为字符'\xa0',也就是拉丁文的不可断行空格,导致了这个问题。想要解决这个具体的问题,可以看看这个链接

补充:下面的评论中有关于打印模块的更具体信息,以及可能导致问题的更详细描述。

补充:这个链接中提到了同样的错误,并且在评论中提到,'ascii' codec错误是Python 2.x特有的,和请求及其他urllib模块有关。这证实了我之前的说法,尽管没有详细记录。

现在给你一些不请自来的建议:如果这个程序比较小,依赖的东西不多,或者使用的库只在Python 2中存在,建议使用Python 3。我在这个夏天开始写一个网页抓取项目,最开始用的是Python 2.7,结果遇到了很多Unicode解码的错误,最后都没能解决,即使我在字符串上使用了解码模块。

后来我发现,Python 3其实是专门为了解决Guido van Rossum自己说的“破坏Python”的问题而设计的——一次性将Unicode和字符串统一起来。

我问你代码是否相对较小的原因是,我其实在几分钟内就把我大约400行的整个脚本升级到了Python 3——尤其是我有一个好的解释器,可以告诉我会出现的语法问题。虽然有一些差别,但并不多,你会很高兴自己做了这个决定。

短期解决方案:使用Python 2对Unicode的(有限)支持。

长期解决方案:找到方法迁移到Python 3。

补充:因为这段代码特别提到了打印模块,所以我收回之前的说法,因为我在打印模块方面的具体经验不足,无法在Python 2.x和3.x中做出测试案例,说明切换到Python 3一定会解决这个问题。不过,OP回复一下,看看问题是否得到解决,还是值得的。

补充2:为了让事情更不确定,我在Python 2.7和Python 3.4中尝试了以下代码:

Python 2.7:

from bs4 import BeautifulSoup
soup = BeautifulSoup(u'string with "\xa0" character')
print soup.prettify()

Python 3.4:

from bs4 import BeautifulSoup
soup = BeautifulSoup('string with "\xa0" character')
print(soup.prettify())

两种方式都返回了相同的预期结果。即使从字符串中移除Unicode分类符,也不会影响Python 2.7的输出。还需要进一步调查。

1

试试这个

print soup.decode('utf-8', 'ignore').prettify()

这个代码会处理soup字符串,忽略掉它看不懂的所有字符

如果你不加'ignore'这个参数,当遇到非ascii字符时,它就会报错

0
print soup.prettify().encode('utf8')
res = requests.get('urlfoobar')
print res.content

虽然在使用 soup 之前,从响应中直接查看内容会更好:

撰写回答