2017-02-03 45 views
3

這是一種附加到較早的問題asking the same things for the text values in an XML node如果沒有找到屬性,如何讓XPath在Python中返回'None'?

lxml可以通過XPath(例如//book/*)在參考示例中測試標記的存在。 有了這個,我可以測試節點的存在並返回None(如果它不存在)並返回文本值(如果存在)。

但是,您似乎不能僅以相同的方式測試某個屬性,例如, //book/@author將直接返回所有書籍中作者屬性值的列表,但沒有None,只是一個較短的列表。

當沒有給定作者屬性時,是否有辦法找回所有擁有Nones的作者的列表?

回答

2

不,在XPath中沒有這樣的構造。

您可以分兩步執行此:

  1. 獲取與XPath的所有book元素,你目前做的(如//book/*
  2. 迭代這些元素,並檢查他們每個人都有一個author屬性(如:book.get('author')if 'author' in book.attrib:
+0

or list comprehension:'[book if'author'in book.attrib else else for book in 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')] 

出:

['1', None, '3', '4', None] 

Xpath是所有關於evalue的位置步驟,任何評估'None'不會顯示在結果列表中。

但標籤的屬性存儲在python字典對象中,如果該屬性不存在,則可以使用dict.get('attr', None)返回None值。

相關問題