我可以让lxml忽略根标记之前和之后的非XML内容吗?

时间:2013-03-04 18:33:53

标签: python lxml

我正在尝试使用lxml处理一个文件,该文件在XML内容之前和之后都可能有一些非xml垃圾,想象有人捕获了一个终端缓冲区,我有这样的东西:

user@host: cat /tmp/log.xml
<log>
  <foo>...</foo>
  <bar>..
...
</bar>

</log>

user@host:

如果我手工使用etree.parse文件名,它会在开头的内容上窒息。我可以删除第一组行,直到找到以'&lt;'开头的行然后把它交给etree.parse,但随后它就收尾了。打开和关闭非xml垃圾可能是任何东西。我可以坚持在文件中只有有效的XML,但我试图容忍我的输入。 有什么想法吗?

2 个答案:

答案 0 :(得分:1)

这是方便与正确之间平衡的另一点:

import re

xml = re.search(r"<(\w+).*</\1>", console_output, flags=re.DOTALL).group()

它需要一个以上述格式给出的单个根标签。

答案 1 :(得分:0)

最多可以清除前面不是开口角度支架的所有东西,以及从末端开始不是关闭角括号的所有东西:

data = data[data.find('<'):data.rfind('>')]

但是如果在实际XML数据之前的开头有任何开口尖括号,并且在数据末尾有任何额外的结束尖括号,这将很容易掉头。在shell环境中,不常见。

如果您只是拒绝任何此类输入,那么 会更容易