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