2017-02-03 3 views
3

이것은 이전 질문 asking the same things for the text values in an XML node의 추가 기능입니다.속성이 없으면 XPath에서 '없음'을 반환합니다.

1xml은 참조 된 예에서 XPath (예 : //book/*)에 의해 태그의 존재를 테스트 할 수 있습니다. 이 노드의 존재 여부를 테스트하고 존재하지 않는 경우 None을 반환하고 텍스트 값이 있으면 반환 할 수 있습니다.

그러나 동일한 방법으로 속성을 테스트 할 수없는 것처럼 보입니다. //book/@author은 모든 서적에서 저자 속성 값이있는 목록을 직접 반환하지만 None이없는 목록은 더 짧습니다.

주어진 저자 속성이 없을 때 Nones가있는 모든 저자와 함께 목록을 가져 오는 방법이 있습니까?

답변

2

아니요, XPath에는 그러한 구성이 없습니다. ,

  1. 이 XPath는 모든 책 요소를 가져옵니다 당신은 (예를 들어 //book/*.)
  2. 반복 처리를하는 것처럼 이러한 요소와 그들 각각의 저자 속성이 있는지 확인 :

    당신은 두 단계로이 작업을 수행 할 수 있습니다 (. 예를 들어 book.get('author') 또는 if 'author' in book.attrib:)

+0

또는 목록 이해 :'[book if 'author if'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는 모두 위치 단계에 대한 평가이며, 아무 것도 평가되지 않습니다. '없음'이 결과 목록에 표시되지 않습니다.

태그의 attrubute가 python dict 객체에 저장되어 있으면 dict.get('attr', None)을 사용하여 속성이없는 경우 None 값을 반환 할 수 있습니다.