关于beautifulsoup:Python:’ascii’编解码器不能编码字符

Python: 'ascii' codec can't encode characters

我使用以下代码来抓取包含日文字符的网页:

1
2
3
4
5
6
7
8
9
10
11
import urllib2
import bs4
import time

url = 'http://www.city.sapporo.jp/eisei/tiiki/toban.html'

pagecontent = urllib2.urlopen(url)
soup = bs4.BeautifulSoup(pagecontent.read().decode("utf8"))

print(soup.prettify())
print(soup)

在一些机器中,代码工作正常,最后两个语句成功地打印了结果。但是,在某些机器中,最后一条语句只给出了错误

1
UnicodeEncodeError 'ascii' codec can't encode characters in position 485-496: ordinal not in range(128),

最后一句话为所有日文字符打印了奇怪的方块。

为什么同一代码在两台机器上的工作方式不同?我怎么修这个?

python版本2.6.6

BS4版本:4.1.0


您需要正确配置环境区域设置;一旦设置了区域设置,在打印到终端时,python将自动接收它。

使用locale命令检查您的区域设置:

1
2
3
4
5
6
7
8
9
$ locale
LANG="en_GB.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL="en_US.UTF-8"

注意我的区域设置中的.UTF-8;它告诉在终端中运行的程序我的终端使用了支持所有Unicode的utf-8编解码器。

您可以使用LANG环境变量在一个步骤中设置所有区域设置:

1
export LANG="en_US.UTF-8"

对于使用UTF-8编解码器的美国地区(日期和数字的打印方式)。准确地说,输出编解码器使用LC_CTYPE设置,而输出编解码器则默认为LANG值。

另请参见针对UNIX/Linux的非常全面的UTF-8和Unicode常见问题解答。