Estoy tratando de aprender XPath. Miré los otros contains()ejemplos por aquí, pero nada que use un operador AND . No puedo hacer que esto funcione:
//ul[@class='featureList' and contains(li, 'Model')]
En:
...
<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>
...

Respuestas:
Sólo se busca en el primer
liniño en la consulta que tiene lugar de buscar cualquierlielemento secundario que pueda contener el texto,'Model'. Lo que necesita es una consulta como la siguiente:Esta consulta le dará los elementos que tienen una
classde lasfeatureListcon uno o máslihijos que contienen el texto,'Model'.fuente
liconModelenul, entonces laandcondición fallará. Entonces laandcondición regresafalseen el conjunto vacío, ¿es correcto?Ya le di mi +1 a la solución de Jeff Yates.
Aquí hay una explicación rápida de por qué su enfoque no funciona. Esta:
encuentra una limitación de la
contains()función (o cualquier otra función de cadena en XPath, para el caso).Se supone que el primer argumento es una cadena. Si lo alimenta con una lista de nodos (darle "
li" hace eso), debe realizarse una conversión a cadena. Pero esta conversión se realiza solo para el primer nodo de la lista.En su caso, el primer nodo de la lista es
<li><b>Type:</b> Clip Fan</li>(convertido a una cadena: "Type: Clip Fan") lo que significa que esto:en realidad seleccionaría un nodo!
fuente
Esta es una nueva respuesta a una vieja pregunta sobre un error común sobre
contains()XPath ...Resumen:
contains()significa que contiene una subcadena , no contiene un nodo .Explicación detallada
Este XPath a menudo se malinterpreta:
Interpretación incorrecta: seleccione aquellos
ulelementos que contengan unlielemento conModelél.Esto está mal porque
contains(x,y)esperaxser una cadena yLa regla XPath para convertir múltiples elementos en una cadena es esta :
Interpretación correcta: seleccione aquellos
ulelementos cuyo primerlihijo tenga un valor de cadena que contenga unaModelsubcadena.Ejemplos
XML
XPaths
//ul[contains(li, 'Model')]selecciona eloneulelementoNota: El
twoulelemento no está seleccionado porque el valor de cadena del primer elementolisecundario detwoulesFoo, que no contiene laModelsubcadena.//ul[li[contains(.,'Model')]]selecciona los elementosoneytwoul.Nota: Ambos
ulelementos se seleccionan porquecontains()se aplica a cada unoliindividualmente. (Por lo tanto, se evita la difícil regla de conversión de elementos múltiples a cadenas). Ambosulelementos tienen unlihijo cuyo valor de cadena contiene laModelsubcadena: la posición dellielemento ya no importa.Ver también
fuente
fuente
Pega mi
containsejemplo aquí:fuente
tableelemento oEC_resultvalor de clase en el código de OP. Esta respuesta no tiene sentido aquí y debe eliminarse.