Próbuję się nauczyć XPath. Spojrzałem na inne contains()
przykłady tutaj, ale nie ma nic, co używa operatora AND . Nie mogę tego uruchomić:
//ul[@class='featureList' and contains(li, 'Model')]
Na:
...
<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>
...
Odpowiedzi:
Szukasz tylko przy pierwszym
li
dziecku w zapytaniu masz zamiast szukać jakiegokolwiekli
elementu podrzędnego, które mogą zawierać tekst'Model'
. Potrzebujesz zapytania, takiego jak następujące:To zapytanie daje elementy, które mają działanie
class
zfeatureList
jednym lub większą liczbąli
dzieci, które zawierają tekst'Model'
.źródło
li
zModel
inul
,and
stan się nie powiedzie. Zatemand
warunek powracafalse
na pusty zbiór, czy jest poprawny?Dałem już +1 rozwiązaniu Jeffa Yatesa.
Oto krótkie wyjaśnienie, dlaczego Twoje podejście nie działa. To:
napotyka ograniczenie
contains()
funkcji (lub dowolną inną funkcję tekstową w XPath, jeśli o to chodzi).Pierwszy argument ma być łańcuchem. Jeśli podasz mu listę węzłów (dając mu to "
li
"), konwersja na łańcuch musi mieć miejsce. Ale ta konwersja jest wykonywana tylko dla pierwszego węzła na liście.W Twoim przypadku pierwszy węzeł na liście jest
<li><b>Type:</b> Clip Fan</li>
(konwertowany na ciąg: „Type: Clip Fan
”), co oznacza, że:faktycznie wybierze węzeł!
źródło
To nowa odpowiedź na stare pytanie dotyczące powszechnego nieporozumienia dotyczącego
contains()
XPath ...Podsumowanie:
contains()
oznacza, że zawiera podciąg , a nie zawiera węzła .Szczegółowe wyjaśnienie
Ten XPath jest często błędnie interpretowany:
Błędna interpretacja: wybrać te
ul
elementy, które zawierają takieli
elementy zeModel
w nim.To jest złe, ponieważ
contains(x,y)
oczekuje,x
że będzie ciągiem, areguła XPath dotycząca konwersji wielu elementów na ciąg jest następująca :
Prawo interpretacji: wybrać te
ul
elementy, których pierwszeli
dziecko ma String wartość , która zawiera sięModel
podciąg.Przykłady
XML
XPaths
//ul[contains(li, 'Model')]
wybieraone
ul
element.Uwaga:
two
ul
element nie jest wybrany, ponieważ ciąg wartości pierwszegoli
dzieckiemtwo
ul
jestFoo
, który nie zawieraModel
podciąg.//ul[li[contains(.,'Model')]]
wybiera elementyone
itwo
ul
.Uwaga: oba
ul
elementy są zaznaczone, ponieważcontains()
są stosowane do każdego z nichli
osobno. (W ten sposób unika się skomplikowanej reguły konwersji wielu elementów na ciąg znaków). Obaul
elementy mają elementli
potomny, którego wartość ciągu zawieraModel
podłańcuch - pozycjali
elementu nie ma już znaczenia.Zobacz też
źródło
źródło
Wklej mój
contains
przykład tutaj:źródło
table
elementu aniEC_result
klasy. Ta odpowiedź nie ma tutaj sensu i powinna zostać usunięta.