2014-01-13 2 views
0

Я пытаюсь использовать Xpath, чтобы найти все <div> s с заданным классом CSS (.product).Выражение Xpath для выбора узлов на основе наличия дочернего узла?

<div class="product"> 
    <a href="#product/1966740"><img class="cover_image" src="https://foobar.JPG" alt="foobar" title="foobar"> 
    <h3>foobar</h3></a> 
    <div class="price">$66.00</div> 
    <div class="rrp">$219.11</div> 
</div> 

Так Xpath, чтобы найти тех, относительно прост:

//div[@class="product"] 

Однако, я только хочу, чтобы найти те продукты, которые не распроданы. Распроданы продукты выглядеть следующим образом:

<div class="product"> 
    <img class="availability" src="https://sold_out_tag.png" alt="sold out"> 
    <a href="#product/1963553"><img class="cover_image" src="foobar.jpg" alt="foobar" title="foobar"> 
    <h3>FooBar<h3></a> 
    <div class="price">$40.00</div> 
    <div class="rrp">$129.33</div> 
</div> 

Я думал, что я не могу() использовать и проверьте <div> с, которые не содержат <img> с атрибутом альта, установленным в «распродано».

Однако следующий не действует:

//div[@class="product" and not([img[@alt="sold out"]])] 

Любые мысли о том, как получить эту работу?

Приветствия, Виктор

ответ

0

Вы были почти там. Вам не нужно [] сек вокруг img подпути:

//div[@class="product" and not(img[@alt = "sold out"])] 

Другой способ писать по существу то же самое, это:

//div[@class="product" and not(img/@alt = "sold out")] 

Наконец, поскольку class атрибуты могут содержать более одного класса, это часто лучше использовать для проверки классов:

//div[contains(concat(' ', @class, ' '), " product ") and not(img/@alt = "sold out")] 
+0

Прохладный, этот работает! =) Вопрос - вы сказали, что мне не нужен [] - как XPath знает, что я прошу проверить наличие дочерних узлов? Во-вторых, что такое конкатенация @class с пробелами? Наконец - любые хорошие руководства, которые вы рекомендуете XPath? – victorhooi

+0

(1) 'not()' преобразует свое содержимое в значение boolean перед выполнением оценки. Если это содержимое является выражением набора узлов, логическое значение будет «false», если набор узлов пуст и «истина», если он не пуст. (2) Пространства предотвращают ложные срабатывания из-за частичного соответствия имени класса. Например, 'contains ('not-a-product', 'product')' будет оцениваться как 'true', а' concains ('not-a-product', 'product') 'будет оцениваться как' false', по желанию. (3) Лучший совет, который я могу дать, - прочитать [спецификацию XPath] (http://www.w3.org/TR/xpath/) и практиковать, практиковать, практиковать. – JLRishe

0

Используйте этот XPath:

//div[@class="product" and not(img[@alt="sold out"])] 
0

вы делаете небольшую ошибку она должна быть

// div [@ class = "product"]/img [@alt! = "Продано"]

+0

Это неверно несколькими способами. – JLRishe

Смежные вопросы