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

时间:2013-07-24 22:42:32

标签: python applescript celementtree

如果这是重复的或者非常明显的事情,请道歉,但请耐心等待我,因为我是Python的新手。我正在尝试使用cElementTree(Python 2.7.5)来解析Applescript中的XML文件。 XML文件包含一些非ASCII文本编码为实体的字段,例如<foo>caf&#233;</foo>

在终端中运行以下基本代码,按预期输出标签和标签内容对:

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中运行相同的代码时,我得到了可怕的 UnicodeEncodeError:'ascii'编解码器无法对位置10中的字符u'\ xe9'进行编码:序数不在范围(128)

我发现如果我将print行更改为

    print [child.tag, child.text]

然后我得到一个包含['']包含的XML标记/值对的字符串,但是任何非ASCII字符然后作为文字Unicode字符串传递到Applescript(所以我最终得到u'caf\\xe9' )。

我尝试了一些方法,包括a。)将.xml文件读入字符串并使用.fromstring而不是.parse,b。)尝试将.xml文件转换为str,然后将其导入cElementTree,c只是坚持.encode,无论我在哪里都可以看到我是否可以避免使用ASCII编解码器,但还没有解决方案。不幸的是,我坚持使用Applescript作为容器。提前感谢您的建议!

2 个答案:

答案 0 :(得分:0)

您需要encode至少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')

答案 1 :(得分:0)

不是AppleScript的错 - 通过猜测你使用什么输出编码,Python是“有用的”。 (不幸的是,根据终端是否连接,它会有不同的猜测。)

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

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

或:

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"