Jak używać XPath contains () tutaj?
Próbuję nauczyć się xpath. Spojrzałem na inne przykłady contains (), ale nic, co używa operatora AND. Nie mogę tego uruchomić:
//ul[@class='featureList' and contains(li, 'Model')]
On:
...
<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>
...
4 answers
Patrzysz tylko na pierwsze li
dziecko w zapytaniu, które masz, zamiast szukać dowolnego li
elementu potomnego, który może zawierać tekst, 'Model'
. To, czego potrzebujesz, to zapytanie takie jak:
//ul[@class='featureList' and ./li[contains(.,'Model')]]
To zapytanie daje elementy, które mają class
z featureList
z jednym lub więcej li
dzieci, które zawierają tekst, 'Model'
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-31 13:07:44
Już dałem +1 do rozwiązania Jeffa Yatesa.
Oto szybkie wyjaśnienie, dlaczego twoje podejście nie działa. To:
//ul[@class='featureList' and contains(li, 'Model')]
Napotyka ograniczenie funkcji contains()
(lub jakiejkolwiek innej funkcji łańcuchowej w XPath).
Pierwszy argument ma być łańcuchem znaków. Jeśli podasz mu listę węzłów (dając jej "li
" robi to), musi nastąpić konwersja na string. Ale ta konwersja jest wykonywana tylko dla pierwszego węzła na liście.
W Twoim przypadku pierwszym węzłem na liście jest <li><b>Type:</b> Clip Fan</li>
(konwertowany na ciąg znaków: "Type: Clip Fan
"), co oznacza, że:
//ul[@class='featureList' and contains(li, 'Type')]
Rzeczywiście wybrać węzeł!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-30 18:33:12
jest to nowa odpowiedź na Stare pytanie o powszechne nieporozumienie o contains()
w XPath...
Summary: contains()
oznacza zawiera podłańcuch, nie zawiera węzeł .
Szczegółowe Wyjaśnienie
Nie jest to jednak możliwe, ponieważ nie jest to możliwe.]}//ul[contains(li, 'Model')]
Błędna interpretacja:
Wybierz te ul
elementy, które zawierają element li
z Model
.
To jest źle ponieważ
-
contains(x,y)
oczekujex
być ciągiem, a -
Reguła XPath do konwersji wielu elementów na łańcuch jest to :
Zbiór węzłów jest konwertowany na łańcuch znaków, zwracając wartość łańcucha z węzeł w zestawie węzłów, który jest pierwszy w porządku dokumentu . Jeśli node-set jest pusty, zwracany jest pusty łańcuch.
Interpretacja prawa: wybierz te ul
elementy, których pierwszy li
dziecko ma string-wartość że zawiera A Model
substring.
Przykłady
XML
<r>
<ul id="one">
<li>Model A</li>
<li>Foo</li>
</ul>
<ul id="two">
<li>Foo</li>
<li>Model A</li>
</ul>
</r>
XPaths
-
//ul[contains(li, 'Model')]
wybieraone
ul
element.Uwaga: The
two
ul
element nie jest zaznaczony, ponieważ łańcuch-wartość pierwszego potomkali
ztwo
ul
jestFoo
, które nie zawiera podciągModel
. -
//ul[li[contains(.,'Model')]]
wybieraone
itwo
ul
żywioły.Uwaga: oba elementy
ul
są wybierane, ponieważ {[2] } jest stosowane do każdegoli
indywidualnie. (W ten sposób unika się skomplikowanej reguły konwersji wielu elementów na ciąg znaków.) Oba elementyul
mają potomkali
, którego wartość łańcuchowa zawieraModel
podłańcuch -- pozycja elementuli
nie ma już znaczenia.
Zobacz również
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-01 19:36:35
Wklej mój contains
przykład tutaj:
//table[contains(@class, "EC_result")]/tbody
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-16 07:39:23