Estou tentando aprender XPath. Eu olhei para os outros contains()
exemplos por aqui, mas nada que usa um operador AND . Não consigo fazer isso funcionar:
//ul[@class='featureList' and contains(li, 'Model')]
Em:
...
<ul class="featureList">
<li><b>Type:</b> Clip Fan</li><li><b>Feature:</b> Air Moved: 65 ft.
Amps: 1.1
Clip: Grips any surface up to 1.63"
Plug: 3 prong grounded plug on heavy duty model
Usage: Garage, Workshop, Dorm, Work-out room, Deck, Office & more.</li><li><b>Speed Setting:</b> 2 speeds</li><li><b>Color:</b> Black</li><li><b>Power Consumption:</b> 62 W</li><li><b>Height:</b> 14.5"</li><li><b>Width:</b> Grill Diameter: 9.5"</li><li><b>Length:</b> 11.5"</li>
<li><b>Model #: </b>CR1-0081-06</li>
<li><b>Item #: </b>N82E16896817007</li>
<li><b>Return Policy: </b></li>
</ul>
...
Respostas:
Você está olhando apenas o primeiro
li
filho na consulta que possui, em vez de procurar qualquerli
elemento filho que possa conter o texto'Model'
,. O que você precisa é de uma consulta como a seguinte:Esta consulta vai dar-lhe os elementos que têm uma
class
defeatureList
com um ou maisli
filhos que contêm o texto,'Model'
.fonte
li
comModel
aul
, então aand
condição falhará. Portanto, aand
condição retornafalse
no conjunto vazio, está correta?Eu já dei meu +1 à solução de Jeff Yates.
Aqui está uma explicação rápida por que sua abordagem não funciona. Este:
encontra uma limitação da
contains()
função (ou qualquer outra função de cadeia no XPath, nesse caso).O primeiro argumento deve ser uma string. Se você alimentar uma lista de nós (se "
li
" fizer isso)), uma conversão em string deverá ocorrer. Mas essa conversão é feita apenas para o primeiro nó da lista.No seu caso, o primeiro nó da lista é
<li><b>Type:</b> Clip Fan</li>
(convertido em uma string: "Type: Clip Fan
"), o que significa que isto:na verdade selecionaria um nó!
fonte
Esta é uma nova resposta para uma pergunta antiga sobre um equívoco comum sobre
contains()
no XPath ...Resumo:
contains()
meios contém uma substring , não contém um nó .Explicação detalhada
Esse XPath geralmente é mal interpretado:
Interpretação incorreta: selecione os
ul
elementos que contêm umli
elementoModel
nele.Isso está errado porque
contains(x,y)
esperax
ser uma string ea regra XPath para converter vários elementos em uma sequência é a seguinte :
Interpretação correta: selecione os
ul
elementos cujo primeiroli
filho possui um valor de sequência que contém umaModel
substring.Exemplos
XML
XPaths
//ul[contains(li, 'Model')]
seleciona oone
ul
elementoNota: O
two
ul
elemento não está selecionado porque o valor da cadeia do primeiroli
filho detwo
ul
éFoo
, que não contém aModel
substring.//ul[li[contains(.,'Model')]]
seleciona os elementosone
etwo
ul
.Nota: Os dois
ul
elementos são selecionados porquecontains()
são aplicados a cada umli
individualmente. (Portanto, a regra complicada de conversão de vários elementos em cadeia é evitada.) Ambos osul
elementos têm umli
filho cujo valor de cadeia contém aModel
substring - a posição doli
elemento não importa mais.Veja também
fonte
fonte
Cole meu
contains
exemplo aqui:fonte
table
elemento ouEC_result
valor de classe no código do OP. Esta resposta não faz sentido aqui e deve ser excluída.