Python中遇到UnicodeEncodeError: 'ascii' codec can't encode character '\uff0c' 该如何解决?

最近想学 python 写爬虫,这个问题困扰我好久了,一直不知道哪里出的问题,代码的背景是开源项目 IPProxyPool 部署到 linux 上。。。在我本地跑的时候没有问题,但是一部署到服务器就出问题,是服务器请求头填的是 ascii 吗。。。代码如下:

# coding:utf-8
from gevent import m onkey
m onkey.patch_all()

import sys
import time
import gevent

from gevent.pool import Pool
from multiprocessing import Queue, Process, Value

from api.apiServer import start_api_server
from config import THREADNUM, parserList, UPDATE_TIME, MINNUM
from db.DataStore import store_data, sqlhelper
from spider.HtmlDownloader import Html_Downloader
from spider.HtmlPraser import Html_Parser
from validator.Validator import validator, getMyIP, detect_from_db

‘’’
这个类的作用是描述爬虫的逻辑
‘’’

default_encoding = ‘utf-8’
if sys.getdefaultencoding() != default_encoding:
reload(sys)
sys.setdefaultencoding(default_encoding)

def startProxyCrawl(queue, db_proxy_num):
crawl = ProxyCrawl(queue, db_proxy_num)
crawl.run()


class ProxyCrawl(object):
proxies = set()

def init(self, queue, db_proxy_num):
self.crawl_pool = Pool(THREADNUM)
self.queue = queue
self.db_proxy_num = db_proxy_num

def run(self):
while True:
self.proxies.clear()
str = ‘IPProxyPool----->>>>>>>>beginning’

##报错显示下面这一行出问题了
sys.stdout.write(str + “\r\n”)
##报错显示上面这一行出问题了
sys.stdout.flush()
proxylist = sqlhelper.select()
myip = getMyIP()
spawns = []
for proxy in proxylist:
spawns.append(gevent.spawn(detect_from_db, myip, proxy, self.proxies))
gevent.joinall(spawns)
self.db_proxy_num.value = len(self.proxies)
str = ‘IPProxyPool----->>>>>>>>db exists ip:%d’ % len(self.proxies)

if len(self.proxies) < MINNUM:
str += ‘\r\nIPProxyPool----->>>>>>>>now ip num < MINNUM,start crawling…’
sys.stdout.write(str + “\r\n”)
sys.stdout.flush()
self.crawl_pool.map(self.crawl, parserList)
else:
str += ‘\r\nIPProxyPool----->>>>>>>>now ip num meet the requirement , wait UPDATE_TIME…’
sys.stdout.write(str + “\r\n”)
sys.stdout.flush()

time.sleep(UPDATE_TIME)

def crawl(self, parser):
html_parser = Html_Parser()
for url in parser[‘urls’]:
response = Html_Downloader.download(url)
if response is not None:
proxylist = html_parser.parse(response, parser)
if proxylist is not None:
for proxy in proxylist:
proxy_str = ‘%s:%s’ % (proxy[‘ip’], proxy[‘port’])
if proxy_str not in self.proxies:
self.proxies.add(proxy_str)
self.queue.put(proxy)


if name == “main”:
DB_PROXY_NUM = Value(‘i’, 0)
q1 = Queue()
q2 = Queue()
p0 = Process(target=start_api_server)
p1 = Process(target=startProxyCrawl, args=(q1, DB_PROXY_NUM))
p2 = Process(target=validator, args=(q1, q2))
p3 = Process(target=store_data, args=(q2, DB_PROXY_NUM))

p0.start()
p1.start()
p2.start()
p3.start()

# spider = ProxyCrawl()
# spider.run()
Python中遇到UnicodeEncodeError: ‘ascii’ codec can’t encode character ‘\uff0c’ 该如何解决?


9 回复

人生苦短,远离 python2


遇到 UnicodeEncodeError: 'ascii' codec can't encode character 这个错误,通常是因为你试图将包含非ASCII字符(比如中文标点\uff0c,即全角逗号)的字符串,在默认编码为ASCII的环境下进行编码(比如写入文件、打印到某些终端或进行网络传输)。

核心原因和解决办法就一个:明确指定正确的编码

1. 写入文件时,指定 encoding='utf-8' 这是最常见的情况。别用默认的 open('file.txt', 'w')

# 错误示例
with open('output.txt', 'w') as f:
    f.write('你好,世界!')  # 包含中文逗号,可能报错

# 正确示例
with open('output.txt', 'w', encoding='utf-8') as f:
    f.write('你好,世界!')  # 明确使用UTF-8编码

2. 打印到控制台/终端 如果终端本身支持UTF-8但Python配置有问题,可以设置环境变量 PYTHONIOENCODING=utf-8 来运行脚本。

PYTHONIOENCODING=utf-8 python your_script.py

或者在代码开头设置标准流的编码(Python 3.7+):

import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

3. 处理字符串编码转换 如果你需要将字符串转换为特定编码的字节(bytes),务必显式指定。

text = '你好,世界!'
# 错误:默认使用ASCII编码
# bytes_data = text.encode() 

# 正确:显式指定UTF-8
bytes_data = text.encode('utf-8')
print(bytes_data)  # b'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8c\xe4\xb8\x96\xe7\x95\x8c\xef\xbc\x81'

总结:处理文本时,始终显式指定编码(尤其是UTF-8)。

我用的 python3.5.1 = =!

在 python3.5 里面写 sys.setdefaultencoding 吗?

好神奇。。我把 sys.setdefaultencoding 去了还是不行,我想看看 str 是什么,就在出错那一行上面添加了 print(str) 就好了。。。

因为 sys.stdout.write 接受的参数是 bytes 而不是 string 。
sys.stdout.write((str + “\r\n”).encode(“utf-8”))

locale 改下,或者像楼上说的那样改代码

能用 repr 把数据打出来看看吗

回到顶部