15

ElementTreeを使用するPython2.6では、HTMLやJavaScriptで実行できることのように、特定の要素内でXMLを(文字列として)フェッチするための良い方法は何innerHTMLですか?

これが私が始めているXMLノードの単純化されたサンプルです:

<label attr="foo" attr2="bar">This is some text <a href="foo.htm">and a link</a> in embedded HTML</label>

私はこの文字列で終わりたいです:

This is some text <a href="foo.htm">and a link</a> in embedded HTML

親ノードを反復処理して子のを連結しようとしましたtostring()が、サブノードしか得られませんでした。

# returns only subnodes (e.g. <a href="foo.htm">and a link</a>)
''.join([et.tostring(sub, encoding="utf-8") for sub in node])

正規表現を使用してソリューションをハックすることはできますが、これよりもハックが少ないものがあることを期待していました。

re.sub("</\w+?>\s*?$", "", re.sub("^\s*?<\w*?>", "", et.tostring(node, encoding="utf-8")))
4

3 に答える 3

12

どうですか:

from xml.etree import ElementTree as ET

xml = '<root>start here<child1>some text<sub1/>here</child1>and<child2>here as well<sub2/><sub3/></child2>end here</root>'
root = ET.fromstring(xml)

def content(tag):
    return tag.text + ''.join(ET.tostring(e) for e in tag)

print content(root)
print content(root.find('child2'))

その結果:

start here<child1>some text<sub1 />here</child1>and<child2>here as well<sub2 /><sub3 /></child2>end here
here as well<sub2 /><sub3 />
于 2010-08-10T04:34:30.600 に答える
6

これは他のソリューションに基づいていますが、私の場合、他のソリューションは機能せず(例外が発生しました)、これは機能しました:

from xml.etree import Element, ElementTree

def inner_xml(element: Element):
    return (element.text or '') + ''.join(ElementTree.tostring(e, 'unicode') for e in element)

MarkTolonenの回答と同じように使用してください。

于 2018-07-01T16:13:51.280 に答える
1

以下は私のために働いた:

from xml.etree import ElementTree as etree
xml = '<root>start here<child1>some text<sub1/>here</child1>and<child2>here as well<sub2/><sub3/></child2>end here</root>'
dom = etree.XML(xml)

(dom.text or '') + ''.join(map(etree.tostring, dom)) + (dom.tail or '')
# 'start here<child1>some text<sub1 />here</child1>and<child2>here as well<sub2 /><sub3 /></child2>end here'

dom.text or ''要素の先頭にあるテキストを取得するために使用されますroot。テキストがない場合dom.textはですNone

結果は有効なXMLではないことに注意してください。有効なXMLにはルート要素が1つだけ含まれている必要があります。

混合コンテンツに関するElementTreeドキュメントをご覧ください。


Python 2.6.5、Ubuntu10.04を使用

于 2010-08-09T20:27:04.213 に答える