首页 > 解决方案 > Python lxml:如何处理解析xml字符串的编码错误?

问题描述

我需要解析 xml 数据的帮助。这是场景:

  1. 我将 xml 文件作为字符串加载到 postgresql 数据库中。
  2. 我将它们下载到文本文件中以供进一步分析。每行对应一个xml文件。
  3. 字符串有不同的编码。有些明确指定utf-8,有些明确指定windows-1252。可能还有其他人;有些没有在字符串中指定编码。
  4. 我需要解析这些字符串以获取数据。我发现的最佳方法如下:
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编码的文件引发的。

我需要能够解析每个字符串,理想情况下无需在下载后以任何方式更改它们。我尝试了以下方法:

  1. 改为应用“windows-1252”作为编码。
  2. 将字符串读取为二进制,然后应用编码
  3. 将字符串读取为二进制并直接使用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" ?>

标签: pythonpostgresqlencodinglxmlwindows-1252

解决方案


鉴于表列是文本,所有 XML 内容都以 UTF-8 格式呈现给 python,因此尝试解析冲突的 XML 编码属性会导致问题。

也许尝试从字符串中剥离该属性。


推荐阅读