Python 在Applescript中使用cElementTree解析XML时出现UnicodeEncodeError

Python 在Applescript中使用cElementTree解析XML时出现UnicodeEncodeError,python,applescript,celementtree,Python,Applescript,Celementtree,很抱歉,如果这是一个重复或一些非常明显的东西,但请容忍我,因为我是Python新手。我正在尝试使用cElementTree(Python 2.7.5)解析Applescript中的XML文件。XML文件包含一些非ASCII文本编码为实体的字段,如café 在终端中运行以下基本代码将按预期输出成对的标记和标记内容: import xml.etree.cElementTree as etree parser = etree.XMLParser(encoding="utf-8") tree =

很抱歉,如果这是一个重复或一些非常明显的东西,但请容忍我,因为我是Python新手。我正在尝试使用cElementTree(Python 2.7.5)解析Applescript中的XML文件。XML文件包含一些非ASCII文本编码为实体的字段,如
café

在终端中运行以下基本代码将按预期输出成对的标记和标记内容:

import xml.etree.cElementTree as etree
parser = etree.XMLParser(encoding="utf-8")
tree = etree.parse("myfile.xml", parser=parser)
root = tree.getroot()
for child in root:
    print child.tag, child.text
但是,当我使用
do shell script
从Applescript中运行相同的代码时,我得到了可怕的Unicodeincoder错误:“ascii”编解码器无法对位置10中的字符u'\xe9'进行编码:序号不在范围(128)

我发现如果我将我的
打印
行更改为

    print [child.tag, child.text]
然后我确实得到了一个包含XML标记/值对的字符串,该字符串用[''包装,但任何非ASCII字符都会作为文本Unicode字符串传递到Applescript(因此我最终得到
u'caf\\xe9'

我尝试了几件事,包括a.)将.xml文件读入字符串,并使用.fromstring而不是.parse;b.)尝试在将.xml文件导入cElementTree之前将其转换为str;c.)只是坚持。尽可能地进行编码,看看是否可以避免使用ASCII编解码器,但还没有解决方案。不幸的是,我无法将Applescript用作容器。提前感谢您的建议

您至少需要
将child.text
转换为Applescript可以处理的内容。如果希望返回角色实体引用,则可以执行以下操作:

print child.tag.encode('ascii', 'xmlcharrefreplace'), child.text.encode('ascii', 'xmlcharrefreplace')
或者如果它可以处理utf-8之类的东西:

print child.tag.encode('utf-8'), child.text.encode('utf-8')

这不是AppleScript的错——Python通过猜测要使用什么输出编码“很有帮助”。(不幸的是,根据是否连接了终端,它的猜测有所不同。)

最简单的解决方案(Python 2.6+)是在调用
Python
之前设置
PythonionEncoding
环境变量:

do shell script "export PYTHONIOENCODING=UTF-8; /usr/bin/python '/path/to/script.py'"
或:


do shell script“export pythonionecoding=UTF-8;/usr/bin/python感谢您的响应!这两行都给出了以下错误:Traceback(最近一次调用):File”“,第6行,在AttributeError中:'NoneType'对象没有属性'encode',可能我遇到了Applescript的限制…这意味着它遇到了一些没有文本的元素-您可以跳过它们(
如果child.text:print…
)或使用其他替换(
如果child.text为None:child.text=''
)。或
str(child.text).encode…
。奇怪的是,在调用cElementTree之前添加这个似乎没有任何效果。我仍然在print命令上得到了UnicodeEncodeError。它是Unix环境变量()。将它放在Python代码中不会起作用-它必须放在shell代码中,如上图所示。顺便说一句,你知道System Events.app有XML套件吗?它不是特别好(请注意,ElementTree也不是)但是,如果您的需求是适度的,那么它可能会帮助您避免跳出AppleScript。或者Satimage的XMLLib.osax,它有点繁琐,但很容易使用IIRC。或者如果您使用10.7+并且Cocoa API不困扰您,您甚至可以从Cocoa AppleScript Applet.app模板创建一个脚本,允许它使用Cocoa的NSXML类通过AppleScript ObjC桥。
do shell script "export PYTHONIOENCODING=UTF-8; /usr/bin/python << EOF

# -*- coding: utf-8 -*-

# your Python code goes here...

print u'A Møøse once bit my sister ...'

EOF"