2016-04-29 23 views
1

上のメタタグのアクセス値:lxmlの - 私は、次のXML要素を持つ要素

<AdditionalAttribute name="Internal Version Identifier" value="UCV261KSBQGBPYF6" dataType="String"></AdditionalAttribute> 

これらのタグの多くがありますが、私は特にこの1をターゲットとしたいと思います。タグのいくつかの例がこれです:私は要素を持っていたら、私はから値を抽出する必要があり、試してみて、「内部バージョン識別子」のために、すべての追加属性を照会するlxmlのとXPathを使用しています

<AdditionalAttribute name="Version Notes" value="This Item was released indirectly as a result of releasing Item 10X9061-11 to In Design." dataType="String"></AdditionalAttribute> 
<AdditionalAttribute name="Change Number" value="BCV2386079506" dataType="String"></AdditionalAttribute> 
<AdditionalAttribute name="Version Shared" value="No" dataType="String"></AdditionalAttribute> 
<AdditionalAttribute name="Effective Version Shared" value="No" dataType="String"></AdditionalAttribute> 
<AdditionalAttribute name="Material Effectivity Date" value="2016-03-15T08:52:33-08:00" dataType="String"></AdditionalAttribute> 

<AdditionalAttribute name="Internal Version Identifier" value="UCV261KSBQGBPYF6" dataType="String"></AdditionalAttribute>      
<AdditionalAttribute name="Item Creation Date" value="2016-03-01T09:08:14-08:00" dataType="String"></AdditionalAttribute>  

'値'フィールド。

名前が "Internal Version Identifier"のAdditionalAttribute要素を探して、値のフィールドに値を取得したいとします。

私はいくつかの異なるものを試したが、私は必要な値を取得することができませんでしされています:ここで

は私の現在のXPathクエリです:

あなたが使用することができます
tree.xpath('//AdditionalAttribute[starts-with(text(), "Internal")]') 
+0

を明確にするためには、その値である属性 '「内部バージョン識別子」 'は' name'という名前かもしれませんし、他の名前が付けられているかもしれません。そうですか? –

+0

質問が更新されました –

答えて

1

を試してみてください//AdditionalAttribute[@name="Internal Version Identifier"]

テスト済み例:

from lxml import etree 

tree = etree.XML(''' 
<root> 
<AdditionalAttribute name="Version Notes" value="This Item was released indirectly as a result of releasing Item 10X9061-11 to In Design." dataType="String"></AdditionalAttribute> 
<AdditionalAttribute name="Change Number" value="BCV2386079506" dataType="String"></AdditionalAttribute> 
<AdditionalAttribute name="Version Shared" value="No" dataType="String"></AdditionalAttribute> 
<AdditionalAttribute name="Effective Version Shared" value="No" dataType="String"></AdditionalAttribute> 
<AdditionalAttribute name="Material Effectivity Date" value="2016-03-15T08:52:33-08:00" dataType="String"></AdditionalAttribute> 

<AdditionalAttribute name="Internal Version Identifier" value="UCV261KSBQGBPYF6" dataType="String"></AdditionalAttribute> 
<AdditionalAttribute name="Item Creation Date" value="2016-03-01T09:08:14-08:00" dataType="String"></AdditionalAttribute> 
</root> 
''') 

elements = tree.xpath('//AdditionalAttribute[@name="Internal Version Identifier"]') 
assert len(elements) == 1 
assert elements[0].attrib["value"] == 'UCV261KSBQGBPYF6' 

また、あなたが全体の要素のみvalueに興味を持ってしていない場合:

elements = tree.xpath(
    '//AdditionalAttribute[@name="Internal Version Identifier"]/@value') 

assert len(elements) == 1 
assert elements[0] == 'UCV261KSBQGBPYF6' 
+0

これは本当にありがとうございました!私はそれをターゲットにするために@ +属性名を使うことができますか?それとも厳密に名前と値のような属性に限定されていますか? –

+0

あなたの前提は正しいです。 '@ FOO'という構文は、常にFOOという名前の属性を参照します。 –

0

//AdditionalAttribute/@value。 それはつかむ:value="UCV261KSBQGBPYF6"

+0

多くのAdditionalAttributeがあることを明確にしておく必要がありました。私はすべてをループすることなくこのターゲットを特にターゲットにできることを望んでいました。 –

+0

何個持っていますか? * [n] 'その型のn番目の要素をつかむ。 – woodchuck

+0

いくつかの例を使って質問を更新しました。静的な数字はありません。時には10の時とそれ以外の時があります100の –

関連する問題