如何使XPath返回';无';在Python中,如果没有找到属性?
这是对前面一个问题的补充 在参考的示例中,lxml可以通过XPath(例如如何使XPath返回';无';在Python中,如果没有找到属性?,python,xml,attributes,lxml,Python,Xml,Attributes,Lxml,这是对前面一个问题的补充 在参考的示例中,lxml可以通过XPath(例如//book/*)测试标记的存在性。 有了它,我可以测试节点的存在性,如果不存在则返回None,如果存在则返回文本值 但是,您似乎不能以相同的方式测试属性,例如,//book/@author将直接返回一个包含所有书籍中author属性值的列表,而没有None,只是一个较短的列表 当没有给出author属性时,是否有方法返回一个包含所有作者的列表,其中没有作者?否,XPath中没有这样的构造 您可以通过两个步骤执行此操作:
//book/*
)测试标记的存在性。
有了它,我可以测试节点的存在性,如果不存在则返回None
,如果存在则返回文本值
但是,您似乎不能以相同的方式测试属性,例如,//book/@author
将直接返回一个包含所有书籍中author属性值的列表,而没有None
,只是一个较短的列表
当没有给出author属性时,是否有方法返回一个包含所有作者的列表,其中没有作者?否,XPath中没有这样的构造 您可以通过两个步骤执行此操作:
//book/*
)book.get('author')
或如果book.attrib中的'author':
)但是标记的attrubute存储在python dict对象中,如果属性不存在,可以使用
dict.get('attr',None)
返回None值。或列表理解:[book if'author'in book.attrib else None for book in data.xpath('//book/*')
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]