2017-02-03 8 views
3

Это своего рода дополнение к более раннему вопросу asking the same things for the text values in an XML node.Как заставить XPath вернуть «None» в Python, если атрибут не найден?

lxml может протестировать существование тега XPath (например, //book/*) в приведенном примере. С этим я могу проверить существование узла и вернуть None, если его нет, и вернуть текстовое значение, если оно существует.

Однако, похоже, вы не можете просто проверить атрибут таким же образом, как например. //book/@author будет напрямую возвращать список со значениями атрибута author во всех книгах, но без None, только более короткий список.

Есть ли способ вернуть список со всеми авторами, в которых есть Nones, когда нет атрибута автора?

ответ

2

Нет, такой конструкции в XPath нет.

Вы можете выполнить в два этапа:

  1. Получить все книжные элементы с XPath, так как в настоящее время вы (например //book/*.)
  2. итерацию эти элементы и проверить, если каждый из них имеет атрибут автора (., например, book.get('author') или if 'author' in book.attrib:)
+0

Упорядочить по спискам: '[book if 'author' in book.attrib else Нет для книги в 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» не будет отображаться в списке результатов.

Но attrubute тега хранится в объекте python dict, вы можете использовать dict.get('attr', None), чтобы вернуть значение None, если атрибут не существует.

 Смежные вопросы

  • Нет связанных вопросов^_^