怎样优雅解决 python 解析 xml gb2312 编码的问题?

2014-09-30 12:04:18 +08:00
 wangleineo
用Python解析编码为gb2312的xml,
<?xml version="1.0" encoding="gb2312" ?>
<node>...</node>
会报错:
ValueError: multi-byte encodings are not supported
试过ElementTree和minidom,都是如此。

最后采用了先解码再编码为utf8:
dstr = dstr.decode('gb2312').encode('utf-8'),
然后再字符串替换
dstr = dstr.replace('gb2312', 'utf-8')
才可以解析xml。很不优雅!

有什么好的解决方案?
20890 次点击
所在节点    问与答
10 条回复
icedx
2014-09-30 12:48:46 +08:00
sudo apt-get install build-essential
sudo apt-get install libsqlite3-dev
sudo apt-get install sqlite3 # for the command-line client
sudo apt-get install bzip2 libbz2-dev
wget http://www.python.org/ftp/python/3.3.5/Python-3.3.5.tar.xz
tar xJf ./Python-3.3.5.tar.xz
cd ./Python-3.3.5
./configure --prefix=/opt/python3.3
make && sudo make install
mkdir ~/bin
ln -s /opt/python3.3/bin/python3.3 ~/bin/py
echo 'alias py="/opt/python3.3/bin/python3.3"' >> .bashrc
ZavierXu
2014-09-30 13:04:02 +08:00
@icedx Python3已经解决了中文字符编码问题了么? 冲着这个我也要升级到python3啊...
Tink
2014-09-30 13:22:49 +08:00
Python3 +1
先decode再encode的方法实在是悲摧
pi1ot
2014-09-30 13:31:41 +08:00
优雅的定义是什么
fxbird
2014-09-30 14:17:37 +08:00
xml本来就应该统一成utf-8的编码,用gb也太不专业了吧
wangleineo
2014-09-30 14:28:20 +08:00
@pi1ot 优雅就是不粗暴
@fxbird 和历史遗迹打交道 没办法
fghzpqm
2014-09-30 15:18:33 +08:00
所有 Python 问题都可以用 «换 Python 3» 解决?

$ ipython
Python 3.4.1 (default, Aug 20 2014, 12:12:32)
Type "copyright", "credits" or "license" for more information.

In [1]: import xml.etree.ElementTree as ET

In [2]: ET.parse('test.xml')
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-2-df5d74dfe4aa> in <module>()
----> 1 ET.parse('test.xml')

/Users/fghzpqm/.pyenv/versions/3.4.1/lib/python3.4/xml/etree/ElementTree.py in parse(source, parser)
1185 """
1186 tree = ElementTree()
-> 1187 tree.parse(source, parser)
1188 return tree
1189

/Users/fghzpqm/.pyenv/versions/3.4.1/lib/python3.4/xml/etree/ElementTree.py in parse(self, source, parser)
596 # It can be used to parse the whole source without feeding
597 # it with chunks.
--> 598 self._root = parser._parse_whole(source)
599 return self._root
600 while True:

ValueError: multi-byte encodings are not supported
fghzpqm
2014-09-30 15:30:42 +08:00
icedx
2014-09-30 23:09:34 +08:00
@ZavierXu 大部分奇葩问题Py3都解决的很好
ZavierXu
2014-10-01 19:07:18 +08:00
@icedx NICE, 现在的Python3是越来越有用的理由了, 把手头Python27的项目做完之后, 以后都常使用3了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/136511

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX