【问题标题】:Escape unescaped data of XML string in python3在python3中转义XML字符串的未转义数据
【发布时间】:2014-04-07 13:51:05
【问题描述】:

我想转义 xml 字符串中的未转义数据 例如

string = "<tag parameter = "something">I want to escape these >, < and &</tag>"

"<tag parameter = "something">I want to escape these &gt;, &lt; and &amp;</tag>"
  • 现在,我绝对不能使用任何 xml 解析库,如 xml.dom.minidom 或 xml.etree,因为数据未转义并且会报错
  • 在正则表达式中,我找到了匹配和获取数据替换的开始和结束位置的方法

    exp = re.search(">.+?</", label)
    # Get position of the data between tags
    start = exp.start() + 1
    end = exp.end() - 2
    return label[ : start] + saxutils.escape(label[start : end]) + label[end : ]
    
  • 但在 re.search 中,我无法匹配确切的 xml 格式

  • 如果我使用 re.findall 我无法获得找到的子字符串的位置
  • 我总是可以通过 index 找到找到的子字符串的位置,但这效率不高,我想要一个简单但有效的解决方案
  • BeautifulSoup 解决方案受到欢迎,但我希望有一些更漂亮的方式来使用 python 的基本库来实现它

【问题讨论】:

  • 这个错误的 XML 最初是如何产生的?如果你能解决这个问题会更容易..
  • 在字符串中你有, 而不是."&gt;.+?&lt;/",也许这就是为什么你无法匹配re.search 中的任何内容
  • @Aleksandar 上面的程序 sn-p 工作得很好
  • 当然@MartijnPieters,但我时间紧迫,这是我能想出的hack :)

标签: python xml regex escaping beautifulsoup


【解决方案1】:

也许你应该考虑re.sub

>>> oldString = '<tag parameter = "something">I want to escape these >, < and &</tag>'
>>> newString = re.sub(r"(<tag.*?>)(.*?)</tag>", lambda m: m.group(1) + cgi.escape(m.group(2)) + "</tag>", oldString)
>>> print newString
<tag parameter = "something">I want to escape these &gt;, &lt; and &amp;</tag>

我的警告是如果您有嵌套标签,正则表达式肯定会中断。见Why is it such a bad idea to parse XML with regex?

【讨论】:

  • 它真正有效的代码形式,但我主要关心的是匹配封闭标签 和 也使用正则表达式
  • @prth 我编辑了代码以匹配 标签。我不确定这是否正是您想要的。
猜你喜欢
  • 2018-05-21
  • 2011-06-25
  • 2012-08-30
  • 2010-11-11
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 2010-12-05
  • 2017-06-25
相关资源
最近更新 更多