2012-04-16 42 views
2

我需要解析一些包含內嵌元素的XML。該XML的外觀,例如,像這樣:Python/ElementTree:解析內聯元素與尊重周圍文本?

<section> Fubar, I'm so fubar, fubar and even more <fref bar="baz">fubare</fref>. And yet more fubar. </section>

如果我現在遍歷這個結構for elem in list(parent): ...我只可以訪問FREF。如果我現在處理fref,那麼周圍的文本當然會丟失,因爲文本不是真正的元素。

有沒有人知道正確解決這個問題的方法?

+0

你想達到什麼目的?你想剝離標籤並保留所有文字嗎? – MattH 2012-04-16 20:15:03

+0

我需要真正解析這件事。這有點像HTMLs a-tag,它可以在線替換,而不會中斷文本。我想我需要在同一時間迭代子元素*和*文本「元素」並保留它們的順序。所以,「Fubar,我是如此......」被處理,然後是fref-tag,然後是文本。 – dom0 2012-04-16 20:17:13

回答

3

以下顯示如何使用lxml實現此目的。

>>> from lxml.etree import fromstring 
>>> tree = fromstring('''<section> Fubar, I'm so fubar, fubar and even more <fref bar="baz">fubare</fref>. And yet more fubar. </section>''') 
>>> elem = tree.xpath('/section/fref')[0] 
>>> elem.text 
'fubare' 
>>> elem.tail 
'. And yet more fubar. ' 
>>> elem.getparent().text 
" Fubar, I'm so fubar, fubar and even more " 

lxml.etreetutorial

如果你想讀的只有文字,即沒有任何中間的標籤, 你必須遞歸串聯所有文字和尾部 正確的順序屬性。同樣情況下,toString()函數使用方法關鍵字來救援, 這個時候:

>>> from lxml.etree import tostring 
>>> tostring(html, method="text") 
" Fubar, I'm so fubar, fubar and even more fubare. And yet more fubar. " 

還有一個XPath的方式來做到這一點,在鏈接頁面的描述。

+0

這正是我想要實現的,但不幸的是我無法安裝其他軟件包。 – dom0 2012-04-16 21:02:13

+0

'xml.etree'不同之處在於元素沒有'getparent()'方法,所以我認爲你必須直接從父元素訪問文本。 – 2012-04-16 21:24:11

+0

是的,它也適用於xml.etree。謝謝! – dom0 2012-04-16 21:58:11