Устранение неполадок выражения XPath для выбора узлов на основе дочернего узла

0

NB. Этот вопрос очень похож на другой, который я попросил - выражение Xpath для выбора узлов на основе наличия дочернего узла? - Тем не менее, я пытаюсь расширить его и провалиться.

У меня есть страница с листингом HTML.

Я пытаюсь использовать Xpath для различения доступных и проданных продуктов.

Доступные продукты выглядят следующим образом:

<div class="product-widget-container">
    <article itemscope="" itemtype="http://schema.org/Product" class="product grid_4 full space omega large " data-productid="1996364" data-name="Daily Wrinkle Defence Essential Skin Reviver Cream Cleanser - 100ml" data-actual-price="5.99" data-is-available="true" data-low-stock="" data-popularity="6" data-smallimgsrc="https://staging.foo.com.au/site_media/uploads/product_image/2014/1/16/pd1996364_94d4a520-7e4a-11e3-930f-000c29c9a057_image_310x434.JPG" data-largeimgsrc="https://staging.foo.com.au/site_media/uploads/product_image/2014/1/16/pd1996364_94d4a520-7e4a-11e3-930f-000c29c9a057_image_310x434.JPG" data-sizes="[]" data-available-sizes="[]" data-categories="[119977]" data-brand="That Natural Source" data-discount="83" data-default-order="9">
        <figure>
            <div class="product-img-container ">
            <img itemprop="image" class="lazy product-img" src="https://staging.foo.com.au/site_media/uploads/product_image/2014/1/16/pd1996364_94d4a520-7e4a-11e3-930f-000c29c9a057_image_310x434.JPG" data-original="https://staging.foo.com.au/site_media/uploads/product_image/2014/1/16/pd1996364_94d4a520-7e4a-11e3-930f-000c29c9a057_image_310x434.JPG" alt="Up to 85% off Summer Looks Daily Wrinkle Defence Essential Skin Reviver Cream Cleanser - 100ml " style="display: inline;">
            <span class="arrow arrow-up"></span>
            <div class="quick-buy" style="display: none;">
            <span class="arrow-down-trans"></span>
            <div class="select-size">
            <form class="express-buy" action="/basket/add/1996364/" method="post">
            <input type="hidden" id="id_quantity_1996364" class="purchase-quantity" name="quantity" value="1">
            <input type="hidden" value="" name="addbasket.x">
            <span>
            <input class="add-to-basket btn btn-primary  btn-large " type="submit" value="ADD TO BASKET">
            </span>
            </form>
            </div>
            </div>
            </div>
            <a itemprop="url" class="overlay-link" href="/event/outlet/up-to-off-summer-looks/1996364-daily-wrinkle-defence-essential-skin-reviver-cream-cleanser-100ml/" title="Daily Wrinkle Defence Essential Skin Reviver Cream Cleanser - 100ml"></a>
            <figcaption>
            <h2 itemprop="name" class="mason name">
            That Natural Source: Daily Wrinkle Defence Essential Skin Reviver Cream Cleanser - 100ml
            </h2>
            <small itemprop="brand" class="bed"> Up to 85% off Summer Looks</small>
            <small class="bed shoes-price">
            $5.99
            <del>$34.95 RRP</del>
            <span class="discount">(83% discount)</span>
            </small>
            </figcaption>
        </figure>
    </article>
</div>

Проданные продукты выглядят так:

<div class="product-widget-container">
    <article itemscope="" itemtype="http://schema.org/Product" class="product grid_4 full space omega large " data-productid="1996526" data-name="#T58 When Monkeys Fly! - Oz The Great And Powerful Collection By OPI" data-actual-price="10.99" data-is-available="" data-low-stock="true" data-popularity="1" data-smallimgsrc="https://staging.foo.com.au/site_media/uploads/product_image/2014/1/16/pd1996526_d0402efe-7e4a-11e3-930f-000c29c9a057_image_310x434.jpg" data-largeimgsrc="https://staging.foo.com.au/site_media/uploads/product_image/2014/1/16/pd1996526_d0402efe-7e4a-11e3-930f-000c29c9a057_image_310x434.jpg" data-sizes="[]" data-available-sizes="[]" data-categories="[119968]" data-brand="OPI" data-discount="0" data-default-order="39">
        <div class="stock-status be_sprites sold-out">Sold Out</div>
        <figure>
            <div class="product-img-container ">
            <img itemprop="image" class="lazy product-img" src="https://staging.foo.com.au/site_media/uploads/product_image/2014/1/16/pd1996526_d0402efe-7e4a-11e3-930f-000c29c9a057_image_310x434.jpg" data-original="https://staging.foo.com.au/site_media/uploads/product_image/2014/1/16/pd1996526_d0402efe-7e4a-11e3-930f-000c29c9a057_image_310x434.jpg" alt="Up to 85% off Summer Looks #T58 When Monkeys Fly! - Oz The Great And Powerful Collection By OPI " style="display: inline;">
            <span class="arrow arrow-up"></span>
            </div>
            <a itemprop="url" class="overlay-link" href="/event/outlet/up-to-off-summer-looks/1996526-t58-when-monkeys-fly-oz-the-great-and-powerful-collection-by-opi/" title="#T58 When Monkeys Fly! - Oz The Great And Powerful Collection By OPI"></a>
            <figcaption>
            <h2 itemprop="name" class="mason name">
            Opi: #T58 When Monkeys Fly! - Oz The Great And Powerful Collection By OPI
            </h2>
            <small itemprop="brand" class="bed"> Up to 85% off Summer Looks</small>
            <small class="bed shoes-price">
            $10.99
            </small>
            </figcaption>
        </figure>
    </article>
</div>  

Я думал, что смогу продолжить либо "распроданный" класс, либо текст " Sold Out внутри него.

Я пробовал все из следующего, и никто из них, похоже, не работает - все они дают мне полный набор продуктов:

//div[@class="product-widget-container" and not(div[@class="stock-status be_sprites sold-out"])]

//div[@class="product-widget-container" and not(div[contains(@class, "sold-out")])]

//div[@class="product-widget-container" and not(div[contains(., "Sold Out")])]

Любые мысли о том, что я делаю неправильно в своем выражении XPath?

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

Теги:
xpath

2 ответа

0
Лучший ответ

Ваши выражения имеют правильную идею, но вам не нужно вставлять скобки [ ]. Как только вы их открываете, вы находитесь в условном заявлении: все, что вы пишете, будет частью заявления. Поэтому, когда вы хотите проверить атрибут дочернего узла, вам просто нужно выбрать его: node[child/@attribute].

Вам также нужно проверить div на любой глубине, так как это не первый дочерний узел. Если вы пишете div[div/@class="foo"], вы проверяете <div><div class="foo"></div></div>. Если вы пишете div[.//div/@class="foo"], вы проверяете <div><anything><bar><div class="foo"></div></bar></anything></div>.

Что-то вроде

//div[@class="product-widget-container" and not(.//div/@class="stock-status be_sprites sold-out")]

должно сработать !

0

пытаться

//div[@class='product-widget-container' and not(@class='stock-status be_sprites sold-out')]

вы должны удалить div[ и ] в предикате

Ещё вопросы

Сообщество Overcoder
Наверх
Меню