2012-04-16 13 views
2

インライン要素を含むXMLを解析する必要があります。 XMLの外観は、例えば、次のように:私はfor elem in list(parent): ...で、この構造体の上に今繰り返す場合Python/ElementTree:周囲のテキストを考慮したインライン要素の解析?

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

私だけFREFへのアクセスを取得します。私が今frefを処理すると、テキストは本当の要素ではないので、周囲のテキストはもちろん失われます。

誰でもこの問題に適切に対処する方法を知っていますか?

+0

達成しようとしていることは何ですか?タグを取り除き、すべてのテキストを残しますか? – MattH

+0

私は実際にそのことを解析する必要があります。これは、テキストを中断することなく、インラインで置き換えられるHTMLのaタグのようなものです。子要素*と*テキスト要素を同時に繰り返し、順序を保持する必要があると思います。だから "Fubar、I'm so fubar ...."が処理され、その後fref-tag、その後のテキストが処理されます。 – dom0

答えて

3

lxmlでこれを達成する方法を次に示します。 lxml.etreetutorialから

>>> 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 " 

あなたが任意の中間タグなしすなわちテキストのみを、読みたい場合は、再帰的にすべてのテキストと尾を連結する必要が は 正しい順序で属性。ここでも、の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

+0

'xml.etree'は要素が' getparent() 'メソッドを持たない点で違うので、親要素のテキストに直接アクセスする必要があると思います。 –

+0

それはxml.etreeでもうまくいきます。ありがとう! – dom0

関連する問題