Python XML解析器无法获取所有文本

时间:2016-05-13 14:12:18

标签: python xml elementtree

我有以下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

我错过了第二个字符串的内容,当它与<a></a>位于同一个<b></b>时?或者这是不可能的etree和我必须重新包装它?给出了XML,因此我无法更改源代码。

感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

在您的第一个示例中,

b.tail将包含second。结束标记之后的文本在ElementTree中被视为tail。实际上它也会包含空格,更像是\n second\n

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

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

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

答案 1 :(得分:0)

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

tostring

此功能只包含元素和子元素的所有文本

答案 2 :(得分:0)

这个怎么样,我在你的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