2016-04-22 137 views
2

我試圖從XML文件中提取文本,但沒有得到我期望的結果。從xml文件中提取文本

這是XML的一個片段,我試圖分析來說明我的問題:

<texto_Quijote_I> 
<bloque nombre="prologo"> 
<autor> 
Desocupado lector: sin juramento me podrás creer que quisiera que este; 
como será poner, tratando de libertad y cautiverio: 
<cita_latin> Non bene pro toto libertas venditur auro.</cita_latin> 
Y luego, en el margen, citar a Horacio, o a quien lo dijo. Si tratáredes 
del poder de la muerte, acudir luego con: 
<cita_latin> 
    Pallida mors aequo pulsat pede pauperum tabernas, 
    Regumque turres. 
</cita_latin> 
Si de la amistad y amor que Dios manda que se tenga al enemigo, entraros 
luego al punto por la Escritura Divina, que lo podéis hacer con tantico de 
curiosidad, y decir las palabras, por lo menos, del mismo Dios: 
<cita_latin>Ego autem dico vobis: diligite inimicos vestros</cita_latin>. 
Si tratáredes de malos pensamientos, 
acudid con el Evangelio: 
<cita_latin>De corde exeunt cogitationes malae</cita_latin>. 
Si de la instabilidad de los amigos, ahí está Catón, que os dará su dístico: 
<cita_latin> 
    Donec eris felix, multos numerabis amicos, 
    tempora si fuerint nubila, solus eris. 
</cita_latin> 
Y con estos latinicos y otros tales os tendrán siquiera por gramático, que 
Y con esto, Dios te dé salud, y a mí no olvide. Vale. 
</autor> 
</bloque> 
</texto_Quijote_I> 

我試圖提取所有某些標籤之間的文本。因此,例如,獲得<autor>..</autor>標籤之間的所有文字,我想這一點:

import xml.etree.ElementTree as ET 
tree = ET.parse("file.xml") 
root = tree.getroot() 
text = "" 
for n in root.findall(".//autor"): 
    text += n.text 

但是,當我檢查字符串,我只得到:

"Desocupado lector: sin juramento me podrás creer que quisiera que este; 
como será poner, tratando de libertad y cautiverio:" 

這是它應該是如何工作的?我期待得到<autor></autor>之間的所有文本。

+0

文檔說文本僅顯示標籤的文本內容。其他東西不是文本(集合和子集理論?)的一部分: Element.findall()僅查找帶有作爲當前元素的直接子元素的標記的元素。 Element.find()用特定的標籤找到第一個子元素,Element.text訪問元素的文本內容。 Element.get()訪問元素的屬性:' 此外,'xml.etree.ElementTree模塊對於惡意構造的數據不安全。如果您需要解析不可信或未經身份驗證的數據,請參閱XML漏洞。# – Adib

回答

0

你必須迭代孩子,並從那裏收集文本。

此外,我利用「尾巴」,因爲它捕獲標籤之間的信息。從文檔報價:如果元素從XML文件創建

,文本屬性包含 無論是元素的開始標籤和它的第一個孩子或 結束標記,或無之間和文字中,尾部屬性包含 元素的結束標記和下一個標記之間的文本,或無。

tree = ET.parse("file.xml") 
root = tree.getroot() 
text = "" 
for n in root.findall(".//autor"): 
    text += n.text 
    text += n.tail 
    for x in n: 
     text += x.text 
     text += x.tail 

print text 

結果

Desocupado lector: sin juramento me podrás creer que quisiera que este; 
como será poner, tratando de libertad y cautiverio: 

    Non bene pro toto libertas venditur auro. 
Y luego, en el margen, citar a Horacio, o a quien lo dijo. Si tratáredes 
del poder de la muerte, acudir luego con: 

    Pallida mors aequo pulsat pede pauperum tabernas, 
    Regumque turres. 

Si de la amistad y amor que Dios manda que se tenga al enemigo, entraros 
luego al punto por la Escritura Divina, que lo podéis hacer con tantico de 
curiosidad, y decir las palabras, por lo menos, del mismo Dios: 
Ego autem dico vobis: diligite inimicos vestros. 
Si tratáredes de malos pensamientos, 
acudid con el Evangelio: 
De corde exeunt cogitationes malae. 
Si de la instabilidad de los amigos, ahí está Catón, que os dará su dístico: 

    Donec eris felix, multos numerabis amicos, 
    tempora si fuerint nubila, solus eris. 

Y con estos latinicos y otros tales os tendrán siquiera por gramático, que 
Y con esto, Dios te dé salud, y a mí no olvide. Vale. 
+1

非常感謝您,「tail」方法正在提取我想要的文本。 – Wunter