Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使XPath返回';无';在Python中,如果没有找到属性?_Python_Xml_Attributes_Lxml - Fatal编程技术网

如何使XPath返回';无';在Python中,如果没有找到属性?

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

这是对前面一个问题的补充

在参考的示例中,lxml可以通过XPath(例如
//book/*
)测试标记的存在性。 有了它,我可以测试节点的存在性,如果不存在则返回
None
,如果存在则返回文本值

但是,您似乎不能以相同的方式测试属性,例如,
//book/@author
将直接返回一个包含所有书籍中author属性值的列表,而没有
None
,只是一个较短的列表


当没有给出author属性时,是否有方法返回一个包含所有作者的列表,其中没有作者?

否,XPath中没有这样的构造

您可以通过两个步骤执行此操作:

  • 使用XPath获取所有书籍元素,就像您当前所做的那样(例如,
    //book/*
  • 迭代这些元素并检查它们是否都有author属性(例如,
    book.get('author')
    如果book.attrib中的'author':
  • Xpath是关于计算位置步骤的,任何计算值为“None”的内容都不会显示在结果列表中


    但是标记的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]