1
votes

Est-il possible de commencer à compter à partir d'un div spécifique en Python en utilisant XPATH et Selenium?

J'ai 80 divs, chaque div (dans notre cas, les classes 24, 27, 30) contient 2 enfants.

Est-il possible de commencer à compter à partir de disons, la 24ème ligne (À L'EXCLUSION DES ENFANTS), puis continuez à compter les rangées en dessous? (en utilisant XPATH uniquement, pas les sélecteurs CSS;))

x = 0
all_the_divs = driver.find_elements_by_xpath("//div/*")
while x < len(all_the_divs):
    # do something
    pass
    if x == 24:
        # catch all the divs under 24 (excluding 24)
        # something like:
        divs_under_x = len(driver.find_elements_by_xpath("//div/div[" + str(x) + "]::"))
       # or
       divs_under_x = len(driver.find_elements_by_xpath("//div/following-sibling::div[" + str(x) + "]*"))
        break
    x += 1

Existe-t-il quelque chose comme:

Disons:

<div class="container">
    ... # dots signify the divs before it
    <div class="24">
        <div class="25"></div>
        <div class="26"></div>
    </div>
    <div class="27">
        <div class="28"></div>
        <div class="29"></div>
    </div>
    <div class="30">
        <div class="31"></div>
        <div class="32"></div>
    </div>
    ... # divs after it
</div>


6 commentaires

il n'y a aucun "enfant" dans votre code donc je dirais que ce n'est pas possible ou possible avec une expression régulière qui considérera indent


Deux choses: premièrement, pour ajouter à ce que @DmitriT a dit, vous n'avez pas 40 lignes X 2; mais simplement 80 lignes, en retrait différemment. Deuxièmement, dans votre code, vous dites (dans le commentaire) que vous souhaitez exclure 24, mais la sortie souhaitée comprend 24.


@DmitriT Merci d'avoir signalé cela, j'ai corrigé les erreurs dans mon code.


@JackFleeting, c'est correct! Je l'ai réparé. Merci pour la tête!


C'est possible de le faire, bien que personnellement je ne puisse le faire qu'en utilisant lxml, pas le sélénium. Faites-moi savoir si vous êtes intéressé et je le posterai.


@JackFleeting, je suis très intéressé. Je pense que je pourrais peut-être le faire avec du sélénium. Merci beaucoup, Jack!


3 Réponses :


1
votes

Voici:

<div class="27">        </div>
<div class="30">         </div>

Résultat:

from lxml import etree

data = [your data above]


tree = lxml.etree.fromstring(data, parser=lxml.etree.HTMLParser())
targets = tree.xpath("*//div[(position()=2 or position()=3) and descendant::div]")
for i in targets:
    for child in i.getchildren():
        child.getparent().remove(child)
    print(etree.tostring(i).decode().replace('\n','').strip())

J'espère que c'est au moins dans la direction générale de ce que vous recherchez ...


1 commentaires

Merci beaucoup! J'ai moi-même trouvé la réponse avant de voir la vôtre. +1 pour l'effort, je ne manquerai pas de lister ma réponse. Merci encore, Jack!



0
votes

Il s'avère que vous devez être dans le nœud dont vous voulez avoir le frère (si vous voulez avoir les frères et sœurs de class = "24" , vous devez être inside le nœud de class="24".

ie

x = 0
all_the_divs = driver.find_elements_by_xpath("//div/*")
while x < len(all_the_divs):
    # do something
    pass
    if x == 24:
        # catch all the divs under 24 (excluding 24)
        divs_under_x = len(driver.find_elements_by_xpath("//div/div[" + str(x) + "]/following-sibling::*"))
        print(len(divs_under_x))
        break
    x += 1

Cela affichera le nombre de divs sous class = "24" sauf ses enfants.


0 commentaires

1
votes

Vous pouvez utiliser Prédicats de filtre XPath pour renvoyer uniquement les enfants du

qui sont supérieurs au nombre donné.

L'expression pertinente serait:

divNumber = 24

interestingDivs = driver.find_elements_by_xpath(
    "//div[@class='container']/child::*[number(@class)>" + str(divNumber) + "]")

for interestingDiv in interestingDivs:
    print(interestingDiv.get_attribute("class"))

traduite en Liaisons Python et Selenium

//div[@class='container']/child::*[number(@class)>24]

Voir Article sur la syntaxe XPath pour plus d'informations


0 commentaires