2016-05-13 45 views
1

我有以下XML源文件。Python 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是給出的,因此我將無法更改源代碼。

感謝您的任何幫助。

回答

0

我找到了一種簡化tostring函數的方法。

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

此功能只是結合了元素的所有文本和子元素

2

b.tail將在您的第一個示例中包含second。 ElementTree中結束標記後面的文本被認爲是tail。其實它也會包含空格,更像\n second\n

考慮XML的格式良好的數據塊:在tail

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

在這裏,在b.text你將得到的數據字段和空白格式,它可以很容易被忽略。

+0

謝謝,這工作。但是我只是發現了tostring函數使它更容易,然後我不依賴於它是在子元素之前還是之後。 –

+0

@Memnon是的,這是一個幫助功能,收集所有的文字和尾巴。但是大多數XML文檔看起來像我上面很好格式化的例子,你不需要尾部,這就是爲什麼這個概念存在。 –

+0

我絕對更喜歡格式良好的XML,但這就是我得到它的方式。我也在考慮在解析之前重新格式化它,但這也很煩人。 –

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