PythonFindall使用带有逻辑AND的xpath模式
这是我的xpath:PythonFindall使用带有逻辑AND的xpath模式,python,xpath,findall,Python,Xpath,Findall,这是我的xpath: <Unit> <_unit_type>FSP</_unit_type> <_logicalId>FSM1/FSP1</_logicalId> </Unit> <Unit> <_unit_type>FSP</_unit_type> <_logicalId>FSM1/FSP2</_logicalId> </Unit>
<Unit>
<_unit_type>FSP</_unit_type>
<_logicalId>FSM1/FSP1</_logicalId>
</Unit>
<Unit>
<_unit_type>FSP</_unit_type>
<_logicalId>FSM1/FSP2</_logicalId>
</Unit>
FSP
FSM1/FSP1
FSP
FSM1/FSP2
因此,当我的xpath\u模式=.//Unit[\u unitType='FSP'][以(\u logicalId,'FSM1']开头时,我需要找到len(root.findall(xpath\u模式)
如果我的模式是//Unit[\u unitType='FSP']
,我的代码可以工作,我可以得到长度为2的值。但是我需要添加另一个限定符,因为我的xml文件要复杂得多
Im获取SyntaxError:使用此模式时谓词无效
//Unit[\u unitType='FSP'][以(\u logicalId,'FSM1']]开头
只需使用AND运算符即可添加所需的条件
例如,如果您正在寻找特定的“单位”:
您还可以使用“|”对多个XPath进行操作。Xpath1 | Xpath2 | Xpath3 |。。。
如果您正在寻找与Unit不同的产品:
//Unit[_unit_type='FSP'][starts-with(_logicalid,'FSM1')]|//Entity[_unit_type='XYZ'][starts-with(_logicalid,'FSM1')]
只需使用和运算符添加所需的条件
例如,如果您正在寻找特定的“单位”:
您还可以使用“|”对多个XPath进行操作。Xpath1 | Xpath2 | Xpath3 |。。。
如果您正在寻找与Unit不同的产品:
//Unit[_unit_type='FSP'][starts-with(_logicalid,'FSM1')]|//Entity[_unit_type='XYZ'][starts-with(_logicalid,'FSM1')]
你已经写信了
.//Unit[_unitType='FSP'][starts-with(_logicalId,'FSM1']
这会导致无效谓词语法错误。这是因为缺少右括号。请尝试以下操作:
.//Unit[_unitType='FSP'][starts-with(_logicalId,'FSM1')]
你已经写信了
.//Unit[_unitType='FSP'][starts-with(_logicalId,'FSM1']
这会导致无效谓词语法错误。这是因为缺少右括号。请尝试以下操作:
.//Unit[_unitType='FSP'][starts-with(_logicalId,'FSM1')]
问题在于lxml
模块出于兼容性原因保留了两个不同的XPath引擎。来自:
findall()
是原始元素树API的一部分。它支持
XPath语言的简单子集,没有谓词、条件和其他高级功能。[…]
另一方面,xpath()支持xpath语言的全部功能,包括谓词、xpath函数和Python扩展函数
使用类似中的xpath()
方法
from lxml import etree
root = etree.XML("""
<root>
<Unit>
<_unit_type>FSP</_unit_type>
<_logicalId>FSM1/FSP1</_logicalId>
</Unit>
<Unit>
<_unit_type>FSP</_unit_type>
<_logicalId>FSM1/FSP2</_logicalId>
</Unit>
</root>""")
print(root.xpath(".//Unit[_unit_type='FSP'][starts-with(_logicalId,'FSM1')]"))
从lxml导入etree
root=etree.XML(“”)
FSP
FSM1/FSP1
FSP
FSM1/FSP2
""")
打印(root.xpath(“.//Unit[\u Unit\u type='FSP']][以(\u logicalId,'FSM1')]开头)
控制台输出:
[<Element Unit at 0x7fa1e0413140>, <Element Unit at 0x7fa1e04130f0>]
[,]
签入问题在于lxml
模块出于兼容性原因保留了两个不同的XPath引擎。来自:
findall()
是原始元素树API的一部分。它支持
XPath语言的简单子集,没有谓词、条件和其他高级功能。[…]
另一方面,xpath()支持xpath语言的全部功能,包括谓词、xpath函数和Python扩展函数
使用类似中的xpath()
方法
from lxml import etree
root = etree.XML("""
<root>
<Unit>
<_unit_type>FSP</_unit_type>
<_logicalId>FSM1/FSP1</_logicalId>
</Unit>
<Unit>
<_unit_type>FSP</_unit_type>
<_logicalId>FSM1/FSP2</_logicalId>
</Unit>
</root>""")
print(root.xpath(".//Unit[_unit_type='FSP'][starts-with(_logicalId,'FSM1')]"))
从lxml导入etree
root=etree.XML(“”)
FSP
FSM1/FSP1
FSP
FSM1/FSP2
""")
打印(root.xpath(“.//Unit[\u Unit\u type='FSP']][以(\u logicalId,'FSM1')]开头)
控制台输出:
[<Element Unit at 0x7fa1e0413140>, <Element Unit at 0x7fa1e04130f0>]
[,]
签入您要导入哪个python模块?除了fot,我不知道任何支持完整XPath标准的模块。我在解析xml文件时使用lxml。您要导入哪个python模块?除了fot,我不知道任何支持完整XPath标准的模块。我在解析xml文件时使用lxml。我有所有可能的AND运算符,即使是您所使用的那个ted,但我仍然收到无效谓词语法错误。:(如果在html代码中从unit_type和logicalid标记中删除下划线,会发生什么情况(标记中不允许使用下划线)?当然,对XPath也要这样做。此外,XPath是区分大小写的:逻辑连接运算符是和。我已经使用了所有可能的and运算符,即使是您发布的and运算符,但仍然会出现无效谓词语法错误。:(如果在html代码中从单元类型和logicalid标记中删除下划线,会发生什么情况(标记中不允许使用下划线)?当然,对XPath也可以这样做。此外,XPath区分大小写:逻辑连接运算符是和。