接受的答案基本上不完整!
它的第二个表达式将匹配“item”,但也将匹配“myitem3”——这是不想要的!
它的第一个表达式只找到“item ng-scope”或“item ng-scope highlight”,如果有任何排列/重新排序,或者类属性的值中存在任何其他空格,则不会匹配。
进一步阅读以获得正确的解决方案:
我正在使用 Selenium 在 Python 中工作,我想查找所有元素
哪个类具有两个可能的名称之一。
1.class="item ng-scope 高亮"
2.class="项目范围"
我认为除了这两个之外,您还需要涵盖类属性的值,例如:
“ng-范围项目”
"项目突出显示 ng-scope"
“ng-scope 项目高亮”
“ng-scope 高亮项目”
"高亮项目 ng-scope"
"突出显示 ng-scope 项"
而且,如果在每个空白“部分”中,或者在字符串的左端或右端有可变数量的空格,那么您最终会得到无限的可能性。 . .
另一个松散点是:
类属性的值是否应该(仅)包含那些类名,或者它们是否还允许包含其他类名,除了想要的?
根据上述问题的答案,可以有两种不同的解决方案,提供如下:
我。 class 属性可以包含其他类名,除了想要的:
/div[contains(concat(' ', @class, ' '), ' list ')]
/div[contains(concat(' ', @class, ' '), ' item ')
and contains(concat(' ', @class, ' '), ' ng-scope ')]
二。 class 属性正好/只包含想要的值:
//div[contains(normalize-space(@class) = 'list')]
/div[contains(concat(' ', @class, ' '), ' item ')
and contains(concat(' ', @class, ' '), ' ng-scope ')
and string-length(normalize-space(@class)) = 13
or
contains(concat(' ', @class, ' '), ' item ')
and contains(concat(' ', @class, ' '), ' ng-scope ')
and contains(concat(' ', @class, ' '), ' highlight ')
and string-length(normalize-space(@class)) = 23
]
这是一个使用 XSLT 的快速验证。转换计算 XPath 表达式并从每个表达式中输出选定的节点:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
Loose classes selection:
<xsl:copy-of select=
"//div[contains(concat(' ', @class, ' '), ' list ')]
/div[contains(concat(' ', @class, ' '), ' item ')
and contains(concat(' ', @class, ' '), ' ng-scope ')]
"/>
==============================
Exact number of classes selection:
<xsl:copy-of select=
"//div[contains(concat(' ', @class, ' '), ' list ')
and string-length(normalize-space(@class)) = 4
]
/div[contains(concat(' ', @class, ' '), ' item ')
and contains(concat(' ', @class, ' '), ' ng-scope ')
and string-length(normalize-space(@class)) = 13
or
contains(concat(' ', @class, ' '), ' item ')
and contains(concat(' ', @class, ' '), ' ng-scope ')
and contains(concat(' ', @class, ' '), ' highlight ')
and string-length(normalize-space(@class)) = 23
]
"/>
</xsl:template>
</xsl:stylesheet>
当此转换应用于以下文档时:
<html>
<div class=" list class2 ">
<div class =" item ng-scope class3 "/>
<div class ="item ng-scope class4 "/>
<div class ="item ng-scope class5 "/>
<div class ="item ng-scope highlight class6 "/>
<div class =" highlight item class7 ng-scope "/>
</div>
<div class=" list ">
<div class =" item ng-scope "/>
<div class ="item ng-scope class4 "/>
<div class =" ng-scope item "/>
<div class ="item ng-scope highlight "/>
<div class =" highligh item ng-scope "/>
</div>
</html>
在这两种情况下都会产生想要的正确结果:
Loose classes selection:
<div class=" item ng-scope class3 "/>
<div class="item ng-scope class4 "/>
<div class="item ng-scope class5 "/>
<div class="item ng-scope highlight class6 "/>
<div class=" highlight item class7 ng-scope "/>
<div class=" item ng-scope "/>
<div class="item ng-scope class4 "/>
<div class=" ng-scope item "/>
<div class="item ng-scope highlight "/>
<div class=" highligh item ng-scope "/>
==============================
Exact number of classes selection:
<div class=" item ng-scope "/>
<div class=" ng-scope item "/>
<div class="item ng-scope highlight "/>
XPath 2.0 解决方案:
使用这两个 XPath 2.0 表达式:
“松散”表达:
//div[contains(concat(' ', @class, ' '), ' list ')]
/div[every $token in ('item', 'ng-scope') satisfies $token = tokenize(@class, '\s+')[.]]
“精确”表达式:
//div[normalize-space(@class) = 'list']
/div[every $token in ('item', 'ng-scope') satisfies $token = tokenize(@class, '\s+')[.]
and not(tokenize(@class, '\s+')[.][3])
or
(every $token in ('item', 'ng-scope', 'highlight')
satisfies $token = tokenize(@class, '\s+')[.]
and not(tokenize(@class, '\s+')[.][4]))
]