xpath - How to select following siblings having only classname and child text elements but not knowing order and text of the following sibling?

Viewed 30

I'm trying to get all the <div class="inply-coupon-row"> which are following siblings of the div with <div class="inply-coupon-row inply-competition-header-row"> and which has .//div/span[2] text = Pokémon. I want to stop as soon as I come across an other <div class="inply-coupon-row inply-competition-header-row">.

When the dynamic page looks like this :

<div class="inply-coupon inply-template-a-coupon">

    <div class="inply-coupon-row inply-competition-header-row">
        <div class="inply-coupon-favcompetition-column">
            <span class="inply-coupon-favstar-icon"></span>
            <span class="inply-coupon-competition-label">Ashes Reborn</span>
        </div>
    </div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>

    <div class="inply-coupon-row inply-competition-header-row">
        <div class="inply-coupon-favcompetition-column">
            <span class="inply-coupon-favstar-icon"></span>
            <span class="inply-coupon-competition-label">Yu-Gi-Oh!</span>
        </div>
    </div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>

    <div class="inply-coupon-row inply-competition-header-row">
        <div class="inply-coupon-favcompetition-column">
            <span class="inply-coupon-favstar-icon"></span>
            <span class="inply-coupon-competition-label">Pokémon</span>
        </div>
    </div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>

I get my data with the following code because nothing is following Pokemon tournament :

//div[preceding-sibling::div[@class="inply-coupon-row inply-competition-header-row" and .//div/span[2][contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),'pok')]]]

Returns all the desired divs :

<div class="inply-coupon-row">...</div>
<div class="inply-coupon-row">...</div>
<div class="inply-coupon-row">...</div>
<div class="inply-coupon-row">...</div>
<div class="inply-coupon-row">...</div>
<div class="inply-coupon-row">...</div>
<div class="inply-coupon-row">...</div>
<div class="inply-coupon-row">...</div>
<div class="inply-coupon-row">...</div>
<div class="inply-coupon-row">...</div>
<div class="inply-coupon-row">...</div>
<div class="inply-coupon-row">...</div>

But, the problem I'm having is that the ordering of tournaments is at random and I don't know if any other tournament will follow Pokemon's.

The webpage usually looks more like this :

<div class="inply-coupon inply-template-a-coupon">
    
    
    <div class="inply-coupon-row inply-competition-header-row">
        <div class="inply-coupon-favcompetition-column">
            <span class="inply-coupon-favstar-icon"></span>
            <span class="inply-coupon-competition-label">Ashes Reborn</span>
        </div>
    </div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    
    
    <div class="inply-coupon-row inply-competition-header-row">
        <div class="inply-coupon-favcompetition-column">
            <span class="inply-coupon-favstar-icon"></span>
            <span class="inply-coupon-competition-label">Yu-Gi-Oh!</span>
        </div>
    </div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>

    
    <div class="inply-coupon-row inply-competition-header-row">
        <div class="inply-coupon-favcompetition-column">
            <span class="inply-coupon-favstar-icon"></span>
            <span class="inply-coupon-competition-label">Pokémon</span>
        </div>
    </div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>

    
    <div class="inply-coupon-row inply-competition-header-row">
        <div class="inply-coupon-favcompetition-column">
            <span class="inply-coupon-favstar-icon"></span>
            <span class="inply-coupon-competition-label">Magic: The Gathering</span>
        </div>
    </div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    
    
    <div class="inply-coupon-row inply-competition-header-row">
        <div class="inply-coupon-favcompetition-column">
            <span class="inply-coupon-favstar-icon"></span>
            <span class="inply-coupon-competition-label">Final Fantasy</span>
        </div>
    </div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>


    <div class="inply-coupon-row inply-competition-header-row">
        <div class="inply-coupon-favcompetition-column">
            <span class="inply-coupon-favstar-icon"></span>
            <span class="inply-coupon-competition-label">Keyforge</span>
        </div>
    </div>
    <div class="inply-coupon-row">...</div>
    <div class="inply-coupon-row">...</div>

    
</div>

Any help would be very appreciated !

1 Answers

You can you this:

//div[not(@class="inply-coupon-row inply-competition-header-row")][preceding-sibling::div[@class="inply-coupon-row inply-competition-header-row"][1][div/span[2][contains(.,'Pokémon')]]]

The trick is the predicate [1], it wil find the first preceding-sibling::div[@class="inply-coupon-row inply-competition-header-row"][1] and if that has your Pokémon string it will succeed.

Related