我正在尝试使用premailer
将我创建的html文档转换为可以使用内联css样式发送电子邮件的内容。但是,当我尝试进行转换时,我收到以下错误:
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py", line 162, in _run_module_as_main
"__main__", fname, loader, pkg_name)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py", line 72, in _run_code
exec code in run_globals
File "/Users/oldo/Python/virtual-environments/AMS-Journal/lib/python2.7/site-packages/premailer/__main__.py", line 142, in <module>
sys.exit(main(sys.argv[1:]))
File "/Users/oldo/Python/virtual-environments/AMS-Journal/lib/python2.7/site-packages/premailer/__main__.py", line 137, in main
options.outfile.write(p.transform(pretty_print=options.pretty))
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2013' in position 106688: ordinal not in range(128)
我已经看到人们提出类似问题的问题过多,但我似乎无法在纠正错误方面取得任何进展。
我的文件是用utf-8
编码的,所以我很困惑为什么我会收到这个错误。
有人会对我可以尝试向前推进的事情提出任何建议吗?
答案 0 :(得分:0)
经过很多人的努力,我终于能够解决问题的根源。显然,我需要更多地了解文本编码之间的差异以及如何在Python中处理它们。
我正在处理预编程的输入文件已在utf-8
中编码,程序似乎需要ascii
。我正在使用与mongodb链接的jinja2创建输入文件,我强制将文件写入ascii
并忽略错误。
import io
# stuff setting up jinja ready to render the template...
renderedTemplate = template.render(context)
email = io.open('email.html', 'w', encoding='ascii', errors="ignore")
email.write(renderedTemplate)
email.close()
我意识到这不是一个理想的解决方案,因为utf-8
无法识别的ascii
字符只会被丢弃,所以可能会有一些看起来很滑稽的字眼,但希望这会不是太大的问题。我很高兴再次与我的项目一起前进!
答案 1 :(得分:0)
有同样的问题,但html源需要utf_8编码。
通过PYTHONIOENCODING
在显式编码格式前加上预编译命令,解决了我的问题:
PYTHONIOENCODING=utf_8 python -m premailer -f reports.html --external-style ./style/jbehave-core.css > emailable-reports.html
在你的情况下可能是另一种方式:
PYTHONIOENCODING=ascii python -m premailer -f report.html --external-style ./style/somestyle.css > emailable-report.html
有关在python中设置/更改默认编码的更多信息: Changing default encoding of Python?