首页 > 解决方案 > lxml XPath 搜索有两个条件

问题描述

我的 XML 文件是:

<releases>
    <release id="1">
        <title>Title1</title>
        <formats>
            <format name="CD" qty="2" text="">
            </format>
        </formats>
        <released>2016-02-00</released>
    </release>
    <release id="2">
        <title>Title2</title>
        <formats>
            <format name="LP" qty="2" text="">
            </format>
        </formats>
        <released>2018-03-00</released>
    </release>
    <release id="3">
        <title>Title3</title>
        <formats>
            <format name="CD" qty="1" text="">
            </format>
        </formats>
        <released>1995-01-15</released>
    </release>  
</releases>

在Python3中,我想找到“格式”名称=“CD”和“发布”文本包含文本“1995”的发布ID(所以发布ID 3应该是结果)

我有这段代码可以找到 CD 发行版并打印发行日期:

for rls in root.findall(".//format[@name='CD']....//released"):
    print (rls.tag, rls.attrib, rls.text)

我也有这段代码,它可以找到所有带有“1995”的版本并打印第一个结果的日期:

print (root.xpath("/releases/release/released[contains(text(),'1995')]")[0].text)

我很难找到如何将两者结合起来(我也在其中一个中使用findall,而xpath在另一个中,不漂亮)。

标签: pythonxmlxpathlxml

解决方案


您可以在 XPath 中组合选择器的谓词部分中的条件。下面告诉 XPath:

  • 返回所有release节点,其中包含:
    • 具有format属性的节点name=CD
    • released具有1995in文本的节点
xml.xpath("./release[.//format[@name='CD'] and .//released[contains(text(),'1995')]]/@id")
# returns:
['3']

推荐阅读