免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4242 | 回复: 7
打印 上一主题 下一主题

python解释xml文件遇到不合法字符,如何解决? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-10 18:27 |只看该作者 |倒序浏览
20可用积分
python2.6,我用minidom解析一个xmlString。一开始不成功,报错:
>>>xmldoc=minidom.parseString(xmlstring)
UnicodeEncodeError: 'ascii' codec can't encode characters in position... ...

我上网查了一下,发现说是python自身的设置问题,于是修改了
C:\Python26\Lib\site.py
把下面这个函数的
def setencoding():
    """Set the string encoding used by the Unicode implementation.  The
    default is 'ascii', but if you're willing to experiment, you can
    change this."""
    encoding = "ascii" # Default value set by _PyUnicode_Init()
    if 0:
        # Enable to support locale aware default string encodings.
        import locale
        loc = locale.getdefaultlocale()
        if loc[1]:
            encoding = loc[1]

... ...里面第一个if 0改成了if 1
然后这个错误没有了,但是在处理xml的过程中,又遇到另一个问题:
Traceback (most recent call last):
  File "d:\my.py", line 50, in <module>
    xmldoc=minidom.parseString(xmlstring)
  File "C:\Python26\lib\xml\dom\minidom.py", line 1928, in parseString
    return expatbuilder.parseString(string)
  File "C:\Python26\lib\xml\dom\expatbuilder.py", line 940, in parseString
    return builder.parseString(string)
  File "C:\Python26\lib\xml\dom\expatbuilder.py", line 223, in parseString
    parser.Parse(string, True)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 43926-43928: ordinal not in range(12

这到底是什么错误?

最佳答案

论坛徽章:
13
双鱼座
日期:2013-10-23 09:30:05数据库技术版块每日发帖之星
日期:2016-04-20 06:20:00程序设计版块每日发帖之星
日期:2016-03-09 06:20:002015亚冠之塔什干火车头
日期:2015-11-02 10:07:452015亚冠之德黑兰石油
日期:2015-08-30 10:07:07数据库技术版块每日发帖之星
日期:2015-08-28 06:20:00数据库技术版块每日发帖之星
日期:2015-08-05 06:20:002015年迎新春徽章
日期:2015-03-04 09:57:09辰龙
日期:2014-12-03 14:45:52酉鸡
日期:2014-07-23 09:46:23亥猪
日期:2014-03-13 08:46:22金牛座
日期:2014-02-11 09:36:21
2 [报告]
发表于 2012-04-10 18:27 |只看该作者
先encode

论坛徽章:
0
3 [报告]
发表于 2012-04-11 09:36 |只看该作者
自己顶一下!

论坛徽章:
0
4 [报告]
发表于 2012-04-11 16:42 |只看该作者
bikong0411 发表于 2012-04-11 16:34
先encode


能展开的说一下么? 先encode然后立刻decode? 能不能简单的写两句代码呢?
谢谢!

论坛徽章:
0
5 [报告]
发表于 2012-04-11 17:22 |只看该作者
我在修改了site.py文件以后,在python shell下面测试,发现结果是这样的:

  1. >>> c=u'\u0e42'
  2. >>> c
  3. u'\u0e42'
  4. >>> print c

  5. >>> from xml.dom import minidom
  6. >>> xmlstring="<tag>"
  7. >>> xmlstring+=c
  8. >>> xmlstring+="</tag>"
  9. >>> xmlstring
  10. u'<tag>\u0e42</tag>'
  11. >>> minidom.parseString(xmlstring)
复制代码
Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    minidom.parseString(xmlstring)
  File "C:\Python26\lib\xml\dom\minidom.py", line 1928, in parseString
    return expatbuilder.parseString(string)
  File "C:\Python26\lib\xml\dom\expatbuilder.py", line 940, in parseString
    return builder.parseString(string)
  File "C:\Python26\lib\xml\dom\expatbuilder.py", line 223, in parseString
    parser.Parse(string, True)
  File "C:\Python26\lib\encodings\cp1252.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_table)
UnicodeEncodeError: 'charmap' codec can't encode character u'\u0e42' in position 5: character maps to <undefined>

如果不修改python的site.py,那么错误就是这样:
UnicodeEncodeError: 'ascii' codec can't encode characters in position... .

论坛徽章:
13
双鱼座
日期:2013-10-23 09:30:05数据库技术版块每日发帖之星
日期:2016-04-20 06:20:00程序设计版块每日发帖之星
日期:2016-03-09 06:20:002015亚冠之塔什干火车头
日期:2015-11-02 10:07:452015亚冠之德黑兰石油
日期:2015-08-30 10:07:07数据库技术版块每日发帖之星
日期:2015-08-28 06:20:00数据库技术版块每日发帖之星
日期:2015-08-05 06:20:002015年迎新春徽章
日期:2015-03-04 09:57:09辰龙
日期:2014-12-03 14:45:52酉鸡
日期:2014-07-23 09:46:23亥猪
日期:2014-03-13 08:46:22金牛座
日期:2014-02-11 09:36:21
6 [报告]
发表于 2012-04-11 17:23 |只看该作者
回复 4# zuiwei


    你可以encode成utf8解析出来之后,在encode成原来的编码

论坛徽章:
0
7 [报告]
发表于 2012-04-11 18:12 |只看该作者
我测试了用elementTree也不行,报类似的错误:

  1. >>> from xml.etree import ElementTree
  2. >>> ElementTree
  3. <module 'xml.etree.ElementTree' from 'C:\Python26\lib\xml\etree\ElementTree.pyc'>
  4. >>> ElementTree.parseString(xmlstring)
复制代码
Traceback (most recent call last):
  File "<pyshell#17>", line 1, in <module>
    ElementTree.parseString(xmlstring)
AttributeError: 'module' object has no attribute 'parseString'

论坛徽章:
0
8 [报告]
发表于 2012-04-12 09:20 |只看该作者
bikong0411 发表于 2012-04-11 17:23
回复 4# zuiwei


怎么才能encode成员来的编码呢? 如何判断原来的编码是什么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP