这是早期问题asking the same things for the text values in an XML node的一种附加组件。
lxml可以在所引用的示例中通过XPath(例如//book/*
)测试标记的存在。
有了这个,我可以测试节点的存在,如果它不存在则返回None
并返回文本值(如果存在)。
但是,您似乎无法以相同的方式测试属性,例如//book/@author
会直接在所有图书中返回包含author属性值的列表,但不包含None
,只是一个较短的列表。
当没有给出作者属性时,有没有办法找回所有包含Nones的作者的列表?
答案 0 :(得分:2)
不,XPath中没有这样的构造。
您可以分两步执行此操作:
//book/*
)book.get('author')
或if 'author' in book.attrib:
)答案 1 :(得分: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值。