2010-03-30 28 views
1

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

回答

3

尝试

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

这将摆脱一切的除了0x20-0x7F范围。

如果您想保留控制字符,如制表符,换行符,您可以从\ x01开始。

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

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

  • 你可以在文件中读入一个名为Python字符串old_str

  • 然后连同lambda语句执行filter电话:

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

M有任何方法可以完成从字符串中去除非ASCII字符。

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

+0

这个答案在潜水艇里剥洋葱(http://joelonsoftware.com/articles/Unicode.html)或我错过了一些东西吗? – mcepl 2011-12-06 08:21:01

+0

@mcepl。你是正确的 - 这只适用于非UNICODE字符,因此不是一个通用的答案。 – Robert 2011-12-09 13:08:50

0

如果确实需要用奇怪的字符数据,你可以,在短短剥夺他们代替,将它们转换为代码的XML解析器可以理解的。

你可以看看unicodedata包,特别是normalize方法。

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

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

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