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>
3 Réponses :
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 ...
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!
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"
.
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.
Vous pouvez utiliser Prédicats de filtre XPath pour renvoyer uniquement les enfants du L'expression pertinente serait: traduite en Liaisons Python et Selenium Voir Article sur la syntaxe XPath pour plus d'informations
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"))
//div[@class='container']/child::*[number(@class)>24]
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!