2017-07-30 115 views
0

我编码XML与 “GBK”:python xml fromstring无法解码gbk编码?

#!/usr/bin/env python 
# encoding: utf-8 
from xml.etree.ElementTree import Element, SubElement, tostring, fromstring, XML, XMLParser 

root = Element('root') 
child = SubElement(root, "child") 
child.text = u"中文" 

result = tostring(root, encoding="gbk") 
print(result) 
print(result.decode("gbk")) 

这将产生的结果是这样的:

b"<?xml version='1.0' encoding='gbk'?>\n<root><child>\xd6\xd0\xce\xc4</child></root>" 

所以,我试图解析XML这样的,我不喜欢这样写道:

tree = XML(result.decode("gbk")) 
print(tree[0].text) 
tree = XML(result.decode("gbk"), parser=XMLParser(encoding="gbk")) 
print(tree[0].text) 
tree = XML(result.decode("gbk"), parser=XMLParser(encoding="utf-8")) 
print(tree[0].text) 

我发现他们都在python 3.6工作,但他们都不在python 2.7工作,在python 2.7错误是:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 50-51: ordinal not in range(128) 

所以,我有两个问题:?

  1. 为什么都XMLParser(encoding="gbk")XMLParser(encoding="utf-8")返回相同的结果python3.6
  2. 如何使XML解析器python2.7工作正常(我不认为result.decode('gbk').encode('utf8').replace('GBK', 'utf-8')是个好主意。)
+0

在你的脚本上设置编码? –

+0

@cᴏʟᴅsᴘᴇᴇᴅ我不明白 – roger

+0

将此设置为脚本的第一行'# - * - coding:utf-8 - * - ' –

回答

-1
>>> from xml.etree.ElementTree import Element, SubElement, tostring, XML 
>>> root = Element("root") 
>>> child = SubElement(root, "child") 
>>> child.text = u"中文" 
>>> result = tostring(root, encoding="utf-8") # Return str in Py2, Return bytes in Py3 
>>> result 
'<root><child>\xe4\xb8\xad\xe6\x96\x87</child></root>' 
>>> print type(result) 
<type 'str'> # The type str in Py2 is the type bytes in Py3 
>>> print result.deocde("utf-8") 
<root><child>中文</child></root> 
>>> tree = XML(result) 
>>> print tree[0].text 
中文 

F或第二个问题,上面的代码在Python 2.7中起作用。

UPDATE

我猜你的目的是从GBK编码字符串构造XML。您可以在Python2中使用lxml或直接使用Python3。

>>> from lxml import etree 
>>> root = etree.Element("root") 
>>> child = etree.SubElement(root, "child") 
>>> child.text = u"中文" 
>>> result = etree.tostring(root, encoding="gbk") 
>>> result 
"<?xml version='1.0' encoding='gbk'?>\n<root><child>\xd6\xd0\xce\xc4</child></root>" 
>>> tree = etree.XML(result) 
>>> tree[0].text 
u'\u4e2d\u6587' 
+0

在我的情况下,我必须使用gbk编码xml,你有改变我的问题 – roger

相关问题