python - Python lxml:如何处理解析xml字符串的编码错误?
问题描述
我需要解析 xml 数据的帮助。这是场景:
- 我将 xml 文件作为字符串加载到 postgresql 数据库中。
- 我将它们下载到文本文件中以供进一步分析。每行对应一个xml文件。
- 字符串有不同的编码。有些明确指定utf-8,有些明确指定windows-1252。可能还有其他人;有些没有在字符串中指定编码。
- 我需要解析这些字符串以获取数据。我发现的最佳方法如下:
encoded_string = bytes(bytearray(xml_data, encoding='utf-8'))
root = etree.fromstring(encoded_string)
当它不起作用时,我会收到两种类型的错误消息:
"Extra content at the end of the document, line 1, column x (<string>, line 1)"
# x varies with string; I think it corresponds to the last character in the line
查看引发异常的行,看起来额外内容错误是由具有windows-1252编码的文件引发的。
我需要能够解析每个字符串,理想情况下无需在下载后以任何方式更改它们。我尝试了以下方法:
- 改为应用“windows-1252”作为编码。
- 将字符串读取为二进制,然后应用编码
- 将字符串读取为二进制并直接使用
etree.fromstring
最后一次尝试产生了这个错误:ValueError: Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration.
我能做些什么?我需要能够读取这些字符串,但不知道如何解析它们。windows编码的xml字符串都以<?xml version="1.0" encoding="windows-1252" ?>
解决方案
鉴于表列是文本,所有 XML 内容都以 UTF-8 格式呈现给 python,因此尝试解析冲突的 XML 编码属性会导致问题。
也许尝试从字符串中剥离该属性。
推荐阅读
- java - Liberty JavaEE 8 捕获 ConstraintViolationException
- android - 如何避免 Android 对我的 *Button* 进行拼写检查?
- reactjs - 从复选框中获取名称和当前值:react js
- java - 如何在执行器端点中自动装配 FactoryBeans
- java - 我无法启动从 spring-boot docker maven 插件构建的 docker 映像
- sql - 如何授予执行权限但不插入更新删除
- reactjs - React 中的工具提示在悬停时显示在单个框中
- python - 以 DataFrame 的列作为 x 轴的图形
- cucumber - 增强 cucumber-jvm 日志记录消息
- javascript - 如何在 JavaScript 中 mouseup(鼠标释放)后调用函数?