python - 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
在另一个中,不漂亮)。
解决方案
您可以在 XPath 中组合选择器的谓词部分中的条件。下面告诉 XPath:
- 返回所有
release
节点,其中包含:- 具有
format
属性的节点name=CD
和 released
具有1995
in文本的节点
- 具有
xml.xpath("./release[.//format[@name='CD'] and .//released[contains(text(),'1995')]]/@id")
# returns:
['3']
推荐阅读
- javascript - One Click Deploy Solution for my webapp
- string - string[] 包括 EFCore2.1
- r - R中的自定义Keras损失函数,带有case_when函数
- c# - 试图找到第 10001 个素数,c#
- c# - 'Ref' 和 'Out' 参数的内存分配,有什么区别吗?
- mysql - Why type data "long blob" in mysql read as "int8" in data explorer MATLAB?
- javascript - Gatsby v2 项目中的缓存问题
- ibm-cloud - 在没有 procfile 的 IBM Bluemix 上部署非 Web 应用程序 (python)?
- android - Ctrl + C vs Ctrl + Z for pausing repo sync?
- r - 使用公式(而不是函数)指定 map2() 的选项