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>

所以,你可以看到,“修订”元素出现在两个不同的地方,不同的级别。我的目标是达到属性“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: invalid predicate

补充说明:似乎tree.find( 'api' )返回无,

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 回答