J'essaye d'apprendre XPath. J'ai regardé les autres contains()
exemples ici, mais rien qui utilise un opérateur AND . Je ne peux pas faire fonctionner ça:
//ul[@class='featureList' and contains(li, 'Model')]
Sur:
...
<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>
...
Réponses:
Vous recherchez uniquement le premier
li
enfant de la requête que vous avez au lieu de rechercher unli
élément enfant pouvant contenir le texte'Model'
,. Ce dont vous avez besoin est une requête comme celle-ci:Cette requête vous donnera les éléments qui ont un
class
defeatureList
avec un ou plusieursli
enfants qui contiennent le texte,'Model'
.la source
li
avecModel
inul
, laand
condition échouera. Donc, laand
condition revientfalse
sur l'ensemble vide, est-ce correct?J'ai déjà donné mon +1 à la solution de Jeff Yates.
Voici une explication rapide des raisons pour lesquelles votre approche ne fonctionne pas. Ce:
rencontre une limitation de la
contains()
fonction (ou de toute autre fonction de chaîne dans XPath, d'ailleurs).Le premier argument est censé être une chaîne. Si vous lui donnez une liste de nœuds (lui donner "
li
" fait cela), une conversion en chaîne doit avoir lieu. Mais cette conversion n'est effectuée que pour le premier nœud de la liste.Dans votre cas, le premier nœud de la liste est
<li><b>Type:</b> Clip Fan</li>
(converti en chaîne: "Type: Clip Fan
"), ce qui signifie que ceci:sélectionnerait en fait un nœud!
la source
Ceci est une nouvelle réponse à une vieille question sur une idée fausse courante sur
contains()
XPath ...Résumé:
contains()
signifie contient une sous-chaîne , ne contient pas de nœud .Explication détaillée
Ce XPath est souvent mal interprété:
Mauvaise interprétation: sélectionnez les
ul
éléments qui contiennent unli
élémentModel
.C'est faux parce que
contains(x,y)
s'attendx
à être une chaîne, etla règle XPath pour convertir plusieurs éléments en une chaîne est la suivante :
Interprétation droite: Sélectionnez les
ul
éléments dont la premièreli
enfant a une valeur de chaîne qui contient uneModel
sous - chaîne.Exemples
XML
XPaths
//ul[contains(li, 'Model')]
sélectionne l'one
ul
élément.Remarque: L'
two
ul
élément n'est pas sélectionné car la valeur de chaîne du premierli
enfant detwo
ul
estFoo
, qui ne contient pas laModel
sous - chaîne.//ul[li[contains(.,'Model')]]
sélectionne les élémentsone
ettwo
ul
.Remarque: les deux
ul
éléments sont sélectionnés car ilscontains()
sont appliqués à chacunli
individuellement. (Ainsi, la règle de conversion délicate de plusieurs éléments en chaîne est évitée.) Les deuxul
éléments ont unli
enfant dont la valeur de chaîne contient laModel
sous-chaîne - la position de l'li
élément n'a plus d'importance.Voir également
la source
la source
Collez mon
contains
exemple ici:la source
table
élément ouEC_result
de valeur de classe dans le code d'OP. Cette réponse n'a aucun sens ici et devrait être supprimée.