Python XML 解析器未获取所有文本

Python XML parser doesn't get all text

我有以下 XML 来源。

<a>
  <b>
     first
  </b>
  second
</a>

我尝试用 python 解析它以获取文本并将整个文本组合成一个字符串,如 firstsecond。为此,我有以下脚本

import xml.etree.ElementTree as ET

top = ET.fromstring(myXml)
for a in top.iter('a'):
  s = ''
  if a.text:
    s += a.text
  else:
    for b in a.iter('b'):
      if b.text:
        s += b.text
  print s

但脚本只打印第一个元素 first。第二个似乎迷路了。当我在 <a></a> 中有两个字符串或在 <b></b> 中都有两个字符串时,它会起作用。

<a>
  firstsecond
</a>

打印 firstsecond

<a>
  <b>
     first
  </b>
  <b>
     second
  </b>
</a>

打印 firstsecond

当第二个字符串与 <b></b> 在同一个 <a></a> 时,我是不是漏掉了一些东西?或者这对 etree 来说是不可能的,我必须重新包装它吗? XML 已给出,因此我无法更改来源。

感谢您的帮助。

b.tail 将在您的第一个示例中包含 second。结束标记后的文本在 ElementTree 中被视为 tail。实际上它也会包含空格并且更像 \n second\n.

考虑一个格式良好的数据块 XML:

<a>
  <b>first</b>
  <b>second</b>
</a>

此处您将获得 b.text 中的数据字段和 tail 中的空白格式,这些很容易被忽略。

我找到了一种使用 tostring 函数简化它的方法。

top = ET.fromstring(myXml)
for a in top.iter('a'):
  s = ET.tostring(a, method='text')
  print s

这个函数只是合并元素和子元素的所有文本

这个怎么样,我在你的 xml 文件上测试过:

import xml.etree.ElementTree as ET
x = 'xml.xml' # your xml file
tree = ET.parse(x)
root = tree.getroot()
string = ""
for c in root:
 string +=  c.text.strip()
print string

输出:

 firstsecond