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

Cleaning an XML file in Python before parsing

我正在使用minidom解析一个XML文件,它抛出一个错误,指示数据的格式不正确。我发现有些页面具有像à1?à?-à1€à??à?¥ &这样的字符,导致解析器出现问题。在我开始分析文件之前,有没有一种简单的方法来清理它?现在,我使用一个正则表达式来丢弃任何不是字母数字字符和字符的东西,但它并不完全起作用。


尝试

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

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

如果要保留制表符、换行符等控制字符,可以从x01开始。

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

看看μtidylib,一个python包装器到tidylib。


看起来您处理的数据是以某种编码方式保存的,它们"好像"是ASCII码。XML文件通常应该是utf8,SAX(minidom使用的底层解析器)应该处理这个问题,所以在处理链的那个部分看起来好像有问题。我先试着确保编码正确和正确识别,而不是专注于"清理"。可能是一个损坏的XML指令?你能编辑你的Q来显示文件的前几行吗,尤其是最开始的指令?


如果您确实需要具有奇怪字符的数据,那么可以将它们转换为XML解析器能够理解的代码,而不只是剥离它们。

您可以查看unicodedata包,尤其是normalize方法。

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

1
2
3
>>> import unicodedata
>>> unicodedata.normalize("NFKD" , u"à1?à? à1€à??à?¥ &")
u'a\u03001\u201ea\u0300 \u0327 a\u03001\u20aca\u0300 \u0327Y\u0308a\u0300 \u0327\xa5 &'

我将抛出所有可以通过设置第8位(0x80)来识别的非ASCII字符(128..255,分别为0x80..0xFF)。

  • 您可以将文件读入名为old_str的python字符串中。

  • 然后结合lambda语句执行filter调用:

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

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

这个问题可能是相关的:如何检查python中的字符串是否是ASCII格式的?