Python xpath/*[.=";Foo";]与谓词中只有字符串的xpath/*[";Foo";]之间有什么区别?

Python xpath/*[.=";Foo";]与谓词中只有字符串的xpath/*[";Foo";]之间有什么区别?,python,xml,xpath,Python,Xml,Xpath,在iPython中使用一种新的(对我来说)方法进行一些测试,该方法基于xpath中的节点文本选择节点。(为了清楚起见,省略了不相关的行) [26]中的:来自lxml导入etree 在[41]中:字符串=“” ...: ...: …:福 ...: ...: ...: ''' 在[43]中:root=etree.fromstring(string) 在[44]中:root.xpath('//inner[text()=“Foo”]”) Out[44]:[] 在[45]中:root.

在iPython中使用一种新的(对我来说)方法进行一些测试,该方法基于xpath中的节点文本选择节点。(为了清楚起见,省略了不相关的行)

[26]中的
:来自lxml导入etree
在[41]中:字符串=“”
...: 
...:    
…:福
...:    
...: 
...: '''
在[43]中:root=etree.fromstring(string)
在[44]中:root.xpath('//inner[text()=“Foo”]”)
Out[44]:[]
在[45]中:root.xpath('//inner[.=“Foo”]')
Out[45]:[]
在[47]中:root.xpath('//inner[“Foo”]')
Out[47]:[]
到目前为止,这一切对我来说都是有意义的。然而:

In [48]: root.xpath('//*[text()="Foo"]')
Out[48]: [<Element inner at 0x10a0387c0>]

In [49]: root.xpath('//*[.="Foo"]')
Out[49]: [<Element inner at 0x10a0387c0>]

In [50]: root.xpath('//*["Foo"]')
Out[50]: 
[<Element outer at 0x10a188200>,
 <Element mid at 0x10a01d6c0>,
 <Element inner at 0x10a0387c0>]
[48]中的
:root.xpath('/*[text()=“Foo”]')
Out[48]:[]
在[49]中:root.xpath('/*[.=“Foo”]'))
出[49]:[]
在[50]中:root.xpath('/*[“Foo”]')
出[50]:
[,
,
]
我曾期望第二个和第三个XPath通过匹配所有三个节点来产生相同的结果。有人能解释为什么它们不同吗

谓词Expr是通过计算Expr并将结果转换为布尔值来计算的。如果结果是一个数字,如果该数字等于上下文位置,则结果将转换为true,否则将转换为false;如果结果不是一个数字,那么将通过调用布尔函数来转换结果。因此,位置路径
para[3]
相当于
para[position()=3]

(我的重点)。因此

相当于

root.xpath('//*["Lemon Pie"]')
root.xpath('//*')
它不会测试
节点的内容;事实上,因为
“Foo”
是一个真实的文字,所以它也相当于

root.xpath('//*["Lemon Pie"]')
root.xpath('//*')
正如Barmar所说,第一个表达式和第二个表达式不匹配除
之外的节点,因为存在空格。要获得这三个参数,请使用trim(或XPath语言中的“规范化空间”):


再加上Amadan的回答,你的第一个和第二个表达式是不相等的。他们两个都会匹配

<Inner>Foo</Inner>
Foo
但是,对于诸如

<Inner><span>Foo</span></Inner>
Foo

FooBar

一般来说,当有人使用
text()
时,10次中有9次应该将其更改为

外部
mid
的文本在
Foo
周围有空格,因此它们不完全匹配。在这种情况下,我不清楚
/*[“Foo”]
的实际选择是什么,因为我希望这也能解释空白。
<Inner><span>Foo</span></Inner>
<Inner>Foo<nbsp/>Bar</Inner>