2017-02-03 6 views
3

これは以前の質問asking the same things for the text values in an XML nodeのアドオンの一種です。属性が見つからない場合、XPathがPythonで 'None'を返すようにするには?

lxmlは、参考例のXPath(例えば、//book/*)によってタグの存在をテストできます。 これでノードの存在をテストし、存在しない場合はNoneを返し、存在する場合はテキスト値を返します。

しかし、同じように属性をテストすることはできないようです。 //book/@authorは、すべての書籍のauthor属性の値を持つリストを直接返しますが、Noneを付けないとリストが短くなります。

著者属性が指定されていないときにNonesを持つすべての著者とリストを返す方法はありますか?

答えて

2

いいえ、XPathにそのような構成はありません。

次の2つの手順でこれを実行することができます。あなたが現在(例えば//book/*)そうであるように

  1. は、XPathの持つすべてのbook要素を取得します
  2. それらの要素を反復処理し、それらのそれぞれは、author属性を持っているかどうかを確認(例えばbook.get('author')またはif 'author' in book.attrib:
+0

またはリストの理解: '' book.attribの場合は 'author'、それ以外の場合はdata.xpath( '// book/*')] – LismUK

0
from lxml import etree 

xml = '''<root xmlns:foo="http://www.foo.org/" xmlns:bar="http://www.bar.org"> 
<books> 
<book author="1">Johnny Dape</book> 
<book >Al Pacino</book> 
<book author="3">Robert De Niro</book> 
<book author="4">Kevin Spacey</book> 
<book >Denzel Washington</book> 
</books> 

</root>''' 

tree = etree.fromstring(xml) 
[book.get('author', None) for book in tree.xpath('//book')] 

アウト:

Xpathはすべての評価ステップを評価します。何かが評価されます。「なし」は結果リストに表示されません。

タグのattrubuteはpython dictオブジェクトに格納されていますが、属性が存在しない場合はdict.get('attr', None)を使用してNone値を返すことができます。

関連する問題