2011-01-13 27 views
17

問題はこれです:私はそうのようなXMLフラグメントがあります - ちょうどと<c> - タグが、その(テキスト)-contentsを保持し、のchildNodes結果についてlxmlでは、タグは削除しますが、すべての内容は保持しますか?

<fragment>text1 <a>inner1 </a>text2 <b>inner2</b> <c>t</c>ext3</fragment> 

を、私はすべての<a>を削除したいです彼らはあるとして。また、<b> -Elementは変更しないでください。結果は、当分の間これ

<fragment>text1 inner<d>1</d> text2 <b>inner2</b> text3</fragment> 

はず、私は非常に汚いトリックに戻りましょう:私は、フラグメントをetree.tostring正規表現を経由して、問題のあるタグを削除し、そして元でフラグメントを置き換えます

from lxml import etree 
fragment = etree.fromstring("<fragment>text1 <a>inner1 </a>text2 <b>inner2</b> <c>t</c>ext3</fragment>") 
fstring = etree.tostring(fragment) 
fstring = fstring.replace("<a>","") 
fstring = fstring.replace("</a>","") 
fstring = fstring.replace("<c>","") 
fstring = fstring.replace("</c>","") 
fragment = etree.fromstring(fstring) 

私はおそらくこれを達成するために、XSLTを使用することができることを知って、私はlxmlのは、XSLTを利用することができることを知っている:この(ない実際のコードが、このような何かを行くべき)のetree.fromstring結果しかし、より多くのlxmlネイティブアプローチが必要ですか?

参考までに:私はlxmlのelement.replaceを使ってそこに到達しようとしましたが、前に要素ノードがあった場所にテキストを挿入したいので、私はそれを行うことはできません。

答えて

31

はこれを試してみてください:http://lxml.de/api/lxml.etree-module.html#strip_tags

>>> etree.strip_tags(fragment,'a','c') 
>>> etree.tostring(fragment) 
'<fragment>text1 inner1 text2 <b>inner2</b> text3</fragment>' 
+0

ありがとう、これは完全に動作します。 「ストリップ」という言葉は私には起きなかったし、自分自身で答えを見つけたかもしれない。 – Thor

+0

真剣に。あなたはPyCon 2011に参加する予定ですか?もしそうなら、あなたにビールを買ってもらうか、あなたの好みの飲み物を買ってください。あなただけで私の夜を作った:) – mkelley33

+0

また、素晴らしい: '' etree.strip_elements(フラグメント、* ['tag1'、 'tag2']) '' – mkelley33

1

HTMLコンテンツからタグを削除するにはlxmlののクリーナー機能を使用してください。 以下は、あなたが望むことをするための例です。 HTML文書の場合、クリーナーはstrip_elementsを使用するよりも、問題に対するより良い一般的な解決策です。このような場合には、タグ以外のものを取り除きたいからです。他のタグでonclick = function()属性のようなものを取り除きたい場合もあります。

import lxml 
from lxml.html.clean import Cleaner 
cleaner = Cleaner() 
cleaner.remove_tags = ['p'] 
remove_tags: 

削除するタグのリスト。タグのみが削除され、そのコンテンツは親タグにプルアップされます。

関連する問題