Как использовать XPath contains () здесь?
Я пытаюсь узнать xpath. Я посмотрел на другие примеры contains () здесь, но ничего, что использует оператор AND. Я не могу заставить это работать:
//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 ответов:
вы смотрите только на первый
liребенок в запросе у вас есть вместо того, чтобы искать любойliдочерний элемент, который может содержать текст,'Model'. Что вам нужно, это запрос, как показано ниже://ul[@class='featureList' and ./li[contains(.,'Model')]]этот запрос даст вам элементы, которые имеют
classнаfeatureListС одним или болееliдети, которые содержат текст,'Model'.
Я уже дал свой +1 к решению Джеффа Йейтса.
вот краткое объяснение почему ваш подход не работает. Это:
//ul[@class='featureList' and contains(li, 'Model')]возникает ограничение
contains()функция (или любая другая строковая функция в XPath, если на то пошло).первый аргумент должен быть строкой. Если вы кормите его список узлов (давая ему "
li" делает это), преобразование в строку должно иметь место. Но это преобразование выполняется для первого узла в списке только.в вашем случае первым узлом в списке является
<li><b>Type:</b> Clip Fan</li>(преобразован в строку: "Type: Clip Fan"), что означает, что это://ul[@class='featureList' and contains(li, 'Type')]фактически выбрал бы узел!
это новый ответ на старый вопрос о распространенное заблуждение о
contains()в XPath...резюме:
contains()означает содержит подстроку,несодержит узел.Подробное Объяснение
этот XPath часто неправильно:
//ul[contains(li, 'Model')]неправильная интерпретация: Выберите те
ulэлементы это содержат anliэлементModelв нем.это неправильно, потому что
contains(x,y)ждетxбыть строкой, иправило XPath для преобразования нескольких элементов в строку этой:
набор узлов преобразуется в строку, возвращая string-value of узел в наборе узлов, который является первым в документ порядок. Если node-set пуст, возвращается пустая строка.
правильное истолкование: выберите те
ulэлементы которого первыйliребенок string-value это содержит aModelподстрока.примеры
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')]выбираетoneulэлемент.Примечание: The
twoulэлемент не выбран, потому что строковое значение первогоliребенок изtwoulиFoo, который не содержитModelподстрока.
//ul[li[contains(.,'Model')]]выбираетoneиtwoulэлементы.Примечание: и
ulэлементы выбраны, потому чтоcontains()применяется к каждойliиндивидуально. (Таким образом, хитрое правило преобразования нескольких элементов в строку избегается.) Обаulэлементы естьliребенок, строковое значение которого содержитModelподстрока -- должностьliэлемент больше не вопросы.см. также
Comments