【问题标题】:Parsing xml with "not well-formed" characters in python在python中用“格式不正确”的字符解析xml
【发布时间】:2013-10-29 08:14:50
【问题描述】:

我正在从一个应用程序中获取 xml 数据,我想在 python 中对其进行解析:

#!/usr/bin/python

import xml.etree.ElementTree as ET
import re

xml_file = 'tickets_prod.xml'
xml_file_handle = open(xml_file,'r')
xml_as_string = xml_file_handle.read()
xml_file_handle.close()

xml_cleaned = re.sub(u'[^\x01-\x7f]+',u'',xml_as_string)
root = ET.fromstring(xml_cleaned)

它适用于带有示例数据的较小数据集,但是当我使用真实的实时数据时,我会得到

xml.parsers.expat.ExpatError: not well-formed (invalid token): line 364658, column 72

查看xml文件,看到364658这一行:

WARNING - (1 warnings in check_logfiles.protocol-2013-05-28-12-53-46) - ^[[0:36mnotice: Scope(Class[Hwsw]): Not required on ^[[0m</description>

我猜是 ^[ 让 python 窒息 - 它也在 vim 中突出显示为蓝色。现在我希望我可以用我的正则表达式替换来清理数据,但这没有用。

最好的办法是修复生成 xml 的应用程序,但这超出了范围。所以我需要按原样处理数据。我该如何解决这个问题?我可以忍受只是扔掉“非法”字符。

【问题讨论】:

  • 你可以试试漂亮的汤,它在为我转义无效字符方面做得很好。
  • 看起来某个过于聪明的家伙想要在他的 tty 上使用粗体或彩色输出来显示此警告。您应该删除从转义到以下“m”的所有内容。

标签: python xml regex


【解决方案1】:

你已经这样做了:

xml_cleaned = re.sub(u'[^\x01-\x7f]+',u'',xml_as_string)

但字符 ^[ 可能是 Python 的 \x1b。如果 xml.parser.expat 卡住它,您只需清理更多内容,只接受 0x20(空格)以下的一些字符。例如:

xml_cleaned = re.sub(u'[^\n\r\t\x20-\x7f]+',u'',xml_as_string)

【讨论】:

  • 只是想知道:是否有一个很好的资源可以让我查看像^[ 这样的特殊字符有时是如何表示的?我不止一次遇到过这样的问题,想知道以后如何处理。
  • 两句话,Python系统地使用\xNN,除了\t \n \r。在 Unix 上,字符 0 到 31 通常写为\@\A、...、\Z\[\\ \]\^\_,即使用反斜杠后的 64 到 95 个字符。还有其他的表示,但我不能给你指路……
【解决方案2】:

我知道这已经很老了,但在下面的 url 上发现了所有主要字符及其编码的列表。

https://medium.com/interview-buddy/handling-ascii-character-in-python-58993859c38e

【讨论】:

    猜你喜欢
    • 2012-07-11
    • 1970-01-01
    • 2012-07-21
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多