Ich versuche XPath zu lernen. Ich habe mir die anderen contains()
Beispiele hier angesehen, aber nichts, das einen AND- Operator verwendet. Ich kann das nicht zum Laufen bringen:
//ul[@class='featureList' and contains(li, 'Model')]
Auf:
...
<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>
...
Antworten:
Sie betrachten nur das erste
li
untergeordneteli
Element in Ihrer Abfrage, anstatt nach einem untergeordneten Element zu suchen , das den Text enthalten kann'Model'
. Was Sie brauchen, ist eine Abfrage wie die folgende:Diese Abfrage gibt Ihnen die Elemente, die ein
class
vonfeatureList
mit einem oder mehrerenli
untergeordneten Elementen haben , die den Text enthalten'Model'
.quelle
li
mitModel
in gibtul
, schlägt dieand
Bedingung fehl. Dieand
Bedingung kehrt alsofalse
auf dem leeren Satz zurück. Ist sie korrekt?Ich habe Jeff Yates 'Lösung bereits meine +1 gegeben.
Hier finden Sie eine kurze Erklärung, warum Ihr Ansatz nicht funktioniert. Dies:
stößt auf eine Einschränkung der
contains()
Funktion (oder einer anderen Zeichenfolgenfunktion in XPath).Das erste Argument soll eine Zeichenfolge sein. Wenn Sie ihm eine Knotenliste zuführen (wenn Sie ihm "
li
" geben), muss eine Konvertierung in einen String erfolgen. Diese Konvertierung wird jedoch nur für den ersten Knoten in der Liste durchgeführt.In Ihrem Fall ist der erste Knoten in der Liste
<li><b>Type:</b> Clip Fan</li>
(in eine Zeichenfolge konvertiert: "Type: Clip Fan
"), was bedeutet, dass dies:würde tatsächlich einen Knoten auswählen!
quelle
Dies ist eine neue Antwort auf eine alte Frage zu einem häufigen Missverständnis über
contains()
in XPath ...Zusammenfassung:
contains()
Mittel enthalten einen Teil , nicht enthält einen Knoten .Ausführliche Erklärung
Dieser XPath wird oft falsch interpretiert:
Falsche Interpretation: Wählen Sie die
ul
Elemente aus, die einli
Element enthaltenModel
.Das ist falsch, weil
contains(x,y)
erwartetx
, eine Zeichenfolge zu sein, unddie XPath Regel mehrere Elemente in einen String für die Umwandlung ist dies :
Richtige Interpretation: Wählen Sie diejenigen
ul
Elemente aus, deren erstes untergeordnetes Elementli
einen Zeichenfolgenwert hat , der eineModel
Teilzeichenfolge enthält .Beispiele
XML
XPaths
//ul[contains(li, 'Model')]
wählt dasone
ul
Element aus.Hinweis: Das
two
ul
Element wird nicht ausgewählt, da der Zeichenfolgenwert des erstenli
untergeordneten Elements von istwo
ul
istFoo
, das denModel
Teilstring nicht enthält .//ul[li[contains(.,'Model')]]
wählt dasone
und austwo
ul
Elemente aus.Hinweis: Beide
ul
Elemente werden ausgewählt, dacontains()
sieli
einzeln angewendet werden . (Somit wird die schwierige Konvertierungsregel für mehrere Elemente in Zeichenfolgen vermieden.) Beideul
Elemente haben ein untergeordnetes Element,li
dessen Zeichenfolgenwert dieModel
Teilzeichenfolge enthält - die Position desli
Elements spielt keine Rolle mehr.Siehe auch
quelle
quelle
Fügen Sie hier mein
contains
Beispiel ein:quelle
table
Element oder keinenEC_result
Klassenwert. Diese Antwort macht hier keinen Sinn und sollte gelöscht werden.