Python:';ascii';编解码器可以';t编码字符

Python:';ascii';编解码器可以';t编码字符,python,beautifulsoup,Python,Beautifulsoup,我正在使用以下代码刮取包含日语字符的网页: 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)

我正在使用以下代码刮取包含日语字符的网页:

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)
在某些机器中,代码工作正常,最后两条语句成功打印结果。 然而,在一些机器中,最后一个语句给出了错误

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
命令检查您的区域设置:

$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
;它告诉终端中运行的程序,我的终端使用UTF-8编解码器,一个支持所有Unicode的编解码器

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

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


另请参阅非常全面的说明。

您正在打印Unicode数据,Python需要对其进行编码,以匹配Python终端或控制台编码。您需要修复终端,以便正确地告诉Python它接受什么编解码器。目前,它告诉Python只有ASCII可以。您正在使用的控制台或终端是什么?@MartijnPieters我正在使用CentOS的默认终端。然后设置环境变量LANG,请参阅。我刚刚检查了运行Mac OSX的机器,可以正确打印结果,其“locale”设置为:LANG=LC\u COLLATE=“C”LC\u CTYPE=“UTF-8”LC\u MESSAGES=“C”LC\u MONETARY=“C”LC\u NUMERIC=“C”LC\u TIME=“C”LC\u ALL=@shapeare:是的,因为输出编码取自
LC\u CTYPE
。我在
~/.bashrc
中添加了一行
export LANG=“ja\u JP.UTF-8”
,然后运行
source~/.bashrc
,因此它生效。但是问题仍然存在,仍然是说
'ascii'编解码器无法对字符进行编码
@shapeare:回溯仍然指向
打印
语句?什么是
导入系统;print sys.stdout.encoding
show Python detected?回溯仍然指向print语句。sys.stdout.encoding打印出
ANSI_X3.4-1968