Как использовать 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>
...
633   4  

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 элементы это содержат an li элемент Model в нем.

это неправильно, потому что

  1. contains(x,y) ждет x быть строкой, и
  2. правило XPath для преобразования нескольких элементов в строку этой:

    набор узлов преобразуется в строку, возвращая string-value of узел в наборе узлов, который является первым в документ порядок. Если node-set пуст, возвращается пустая строка.

правильное истолкование: выберите те ul элементы которого первыйli ребенок string-value это содержит a Model подстрока.

примеры

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 элемент больше не вопросы.

см. также

вставить мой contains пример:

//table[contains(@class, "EC_result")]/tbody

Comments

    Ничего не найдено.