在解析之前用Python清理XML文件

时间:2010-03-30 14:03:00

标签: python xml

我正在使用minidom来解析xml文件,并且它抛出一个错误,指示数据格式不正确。我发现有些页面有像ไอเฟล &这样的字符,导致解析器打嗝。在开始解析文件之前,是否有一种简单的方法来清理文件?现在我正在使用常规表达式抛弃任何不是字母数字字符和</>字符的东西,但它不是很有效。

5 个答案:

答案 0 :(得分:3)

尝试

xmltext = re.sub(u"[^\x20-\x7f]+",u"",xmltext)

它将除去除0x20-0x7F范围之外的所有内容。

如果你想保留像tab,换行符这样的控制字符,你可以从\ x01开始。

xmltext = re.sub(u"[^\x01-\x7f]+",u"",xmltext)

答案 1 :(得分:1)

查看µTidyLibTidyLib的Python包装器。

答案 2 :(得分:0)

如果您确实需要包含奇怪字符的数据,而不是仅剥离它们,请将它们转换为XML解析器可以理解的代码。

您可以查看unicodedata包,尤其是规范化方法。

我自己没有使用它,所以我不能告诉你那么多,但如果你决定要转换并保存这些数据,你可以在这里再问一次。

>>> import unicodedata
>>> unicodedata.normalize("NFKD" , u"ไภเฟล &")
u'a\u03001\u201ea\u0300 \u0327 a\u03001\u20aca\u0300 \u0327Y\u0308a\u0300 \u0327\xa5 &'

答案 3 :(得分:0)

看起来你正在处理使用某种编码保存的数据“好像”它们是ASCII。 XML文件通常应该是UTF8,而SAX(minidom使用的底层解析器)应该处理它,因此在处理链的那一部分看起来有些不对劲。我没有专注于“清理”,而是首先尝试确保编码正确并正确识别。也许是一个破碎的XML指令?你能编辑你的Q来显示文件的前几行,特别是一开始的<?xml ...指令吗?

答案 4 :(得分:-1)

我会丢弃所有非ASCII字符,可以通过设置第8位(0x80)来识别(128 .. 255分别为0x80 .. 0xff)。

  • 您可以将文件读入名为old_str

  • 的Python字符串中
  • 然后结合filter声明执行lambda调用:

    new_str = filter(lambda x: x in string.ascii_letters, old_str)
    
  • 解析new_str

有许多方法可以完成从字符串中剥离非ASCII字符。

这个问题可能有关:How to check if a string in Python is in ASCII?