我正在尝试使用lxml处理一个文件,该文件在XML内容之前和之后都可能有一些非xml垃圾,想象有人捕获了一个终端缓冲区,我有这样的东西:
user@host: cat /tmp/log.xml
<log>
<foo>...</foo>
<bar>..
...
</bar>
</log>
user@host:
如果我手工使用etree.parse文件名,它会在开头的内容上窒息。我可以删除第一组行,直到找到以'&lt;'开头的行然后把它交给etree.parse,但随后它就收尾了。打开和关闭非xml垃圾可能是任何东西。我可以坚持在文件中只有有效的XML,但我试图容忍我的输入。 有什么想法吗?
答案 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环境中,不不常见。
如果您只是拒绝任何此类输入,那么 会更容易
。