1

だから、ここに私のXMLツリーがあります:

<?xml version="1.0"?>
<api>
    <query>
        <normalized>
            <n from="Brain_cancer" to="Brain cancer" />
        </normalized>
        <redirects>
            <r from="Brain cancer" to="Brain tumor" 
            />
        </redirects>
        <pages>
            <page pageid="37284" ns="0" title="Brain tumor">
                <revisions>
                    <rev revid="412658600" parentid="412501243" user="Andycjp" userid="55014" timestamp="2011-02-08T03:35:27Z" size="59870" sha1="fe1ff25c27ebc86572aa4be8201cb813e1bf3d32" comment="/* Psychological and behavioral consequences */"  contentformat="text/x-wiki" contentmodel="wikitext" xml:space="preserve">
                    </rev>
                </revisions>
            </page>
        </pages>
    </query>
    <warnings>
        <revisions xml:space="preserve">
        </revisions>
        <result xml:space="preserve">
        </result>
    </warnings>
    <query-continue>
        <revisions rvcontinue="456175380" 
        />
    </query-continue>
</api>

ご覧のとおり、「リビジョン」要素は 2 つの異なる場所、異なるレベルに表示されます。私の目的は、属性「rvcontinue」(パスは api/query-continue/revisions です) に到達して、その値を新しい変数にコピーすることです。おそらく、私が正しく理解していないためですが、elementTree と xpath はこれまでのところ機能しませんでした。

これは私がこれまで行ってきたことですが、どこにも行きません

import xml.etree.ElementTree as ET
tree = ET.parse('Brain_tumor_5.xml')

for elem in tree.getiterator():
    if elem.tag=='{http://www.namespace.co.uk}query-continue':
        output = {}
        for elem1 in list(elem):
            if elem1.tag=='{http://www.namespace.co.uk}revisions':
                output['rvcontinue']=elem1.text
        print output

p = tree.find("./api/query-continue/revisions[@rvcontinue=]")
q = p.attrib
print q
4

2 に答える 2

1

私も主にlxmlを使用しているので、etreeで何が起こっているのかわかりませんが、ツリーからの検索は機能しないようですが、ルートからの検索は機能します:

>>> tree.getroot().find( 'query-continue/revisions[@rvcontinue]' ).attrib['rvcontinue']
'456175380'

また、上記の単なるタイプミスかどうかはわかりませんが、

p = tree.find("./api/query-continue/revisions[@rvcontinue=]")

SyntaxError:無効な述語が返されます

追加された注: tree.find( 'api' )None を返すように見えますが、

しかし、tree.find( '.' )戻ります<Element 'api' at 0x1004e5f10>

それでtree.find( './query-continue/revisions[@rvcontinue]' )

も機能します。

于 2013-01-30T23:38:02.743 に答える
0

これはあなたの質問に直接答えるものではありません。ただし、lxml.etree(おそらく同じElementTreeインターフェイスを提供する) と次のコードを使用します。

>>> import lxml.etree
>>> doc = lxml.etree.parse('doc.xml')
>>> node = doc.xpath('/api/query-continue/revisions[@rvcontinue]')
>>> node[0].attrib['rvcontinue']
'456175380'

試してみましxml.etree.ElementTreeたが、動作していないようです。

于 2013-01-30T23:14:02.340 に答える