为了简化问题,就把xml的内容简化为如下的形式:

<?xml version="1.0" encoding="gbk"?><DOCUMENT><da><![CDATA[中文,就是任性]]></da></DOCUMENT>

它的encoding为gbk,其中的节点有一个为中文字符
使用lxml提取节点的值时出现了如下的异常

lxml.etree.XMLSyntaxError: Extra content at the end of the document

此时对应的Python脚本为:

tst = u'<?xml version="1.0" encoding="gbk"?><DOCUMENT><da><![CDATA[中文,就是任性]]></da></DOCUMENT>'
for event,element in etree.iterparse(BytesIO(tst.encode('utf-8'))):
    print("%s, %s" % (element.tag, element.text))

不过简化之前,报的是另外一个异常

lxml.etree.XMLSyntaxError: input conversion failed due to input error, bytes 0x8B 0x2C 0xE6 0x9D

不论异常是哪一个,猜测还是和字符的编码形式有关。
经过各种尝试无果,后来在stackoverflow上看到这篇文章,文中提到的问题和xml中的encoding值有关,尝试了增加了一段代码

tst = u'<?xml version="1.0" encoding="gbk"?><DOCUMENT><da><![CDATA[中文,就是任性]]></da></DOCUMENT>'
tst = tst.replace('encoding="gbk"', 'encoding="utf-8"')
for event,element in etree.iterparse(BytesIO(tst.encode('utf-8'))):
    print("%s, %s" % (element.tag, element.text))

增加了一个替换的语句,将之前的encoding="gbk"替换成encoding:"utf-8"
于是终于得到了结果:

da, 中文,就是任性
DOCUMENT, None

以上就是详解lxml处理xml时的字符编码问题的详细内容,更多请关注php中文网其它相关文章!

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

  • 相关标签:lxml,xml,字符编码
  • 程序员必备接口测试调试工具:点击使用

    Apipost = Postman + Swagger + Mock + Jmeter

    Api设计、调试、文档、自动化测试工具

    网页生成APP,用做网站的技术去做APP:立即创建

    手机网站开发APP、自助封装APP、200+原生模块、2000+映射JS接口按需打包

    • 上一篇:详细介绍Linq读取XML的示例代码
    • 下一篇:XML实体扩展攻击代码实例分享

    相关文章

    相关视频


    • 使用xmlhttp为网站增加域名查询功能的示例代码...
    • 四种XML解析方式详解
    • 基于PHP对XML的操作详解
    • XML和Tomcat的入门知识的详细介绍
    • 详解lxml处理xml时的字符编码问题
    • Vue3 事件修饰符
    • vue3 指令
    • vue3 基础语法
    • vue3 组合api和选项api介绍

    视频教程分类

    • php视频教程
    • html视频教程
    • css视频教程
    • JS视频教程
    • jQuery视频教程
    • mysql视频教程
    • Linux视频教程
    • Python视频教程
    • Laravel视频教程
    • Vue视频教程

    专题

    详解lxml处理xml时的字符编码问题