2017-09-21 1 views
0

Je suis en train de gratter ce code HTML en utilisant le sélénium et PhantomJS. Le motif de lignes se répète avec les lignes 1 à N et je ne sais pas combien de lignes il y aura.gratter éléments liés dans la même rangée d'une table en utilisant le sélénium, mais sans xpath

<table id="TableName"> 
<thead></thead> 
<tbody> 
    <tr id="Row 1"> 
     <td class="Details column"> 
     </td> 
     <td class="More details column"> 
     </td> 
     <td class="Extra details column"> 
      <div class="unique_information"> 
       <div class="print-only">ID # 1234</div> 
      </div> 
     </td> 
     <td class="Numbers column"> 
      <div class="numbers-data"> 
       <div> 
        <label class="specific_number">123456</label> 
       </div> 
      </div>  
     </td> 
     <td class="Numbers column"> 
      <div class="numbers-data"> 
       <div> 
        <label class="specific_number">345678</label> 
       </div> 
      </div>  
     </td> 
     <td class="Numbers column"> 
      <div class="numbers-data"> 
       <div> 
        <label class="specific_number">234567</label> 
       </div> 
      </div> 
     </td> 
    </tr> 
</tbody> 

Dans ce cas, je suis en train de trouver le plus grand class_by_name (specific_number) (ie. 345678) qui pourrait être dans l'un des « NUMBER colonnes » qui est également dans la même rangée associée avec la "information unique" spécifique que je recherche (par exemple 1234). Je ne suis pas génial avec xpath, et je ne connaîtrai pas la ligne parente qui a cette information unique à l'avance (c'est-à-dire qui pourrait être dans la rangée 1, 2, 3, etc) donc j'ai du mal à venir avec une instruction contains qui vérifie que les deux sont vrais.

+0

Le numéro peut provenir de n'importe quelle ligne, mais cette ligne doit contenir le texte 'ID # 1234'. Est-ce que je vous ai bien compris? –

+0

Si vous ne voulez pas utiliser XPath, pourquoi avez-vous ajouté le tag XPath à votre question? – kjhughes

+0

Je suis ouvert à XPath, je ne suis pas très bon, donc c'est plus difficile pour moi de suivre. Je préférerais une solution non XPath. –

Répondre

0
def findLargestNumInRow(id): 
    xpath = '//table[@id="TableName"]/tbody/tr[td[3][div/div[contains(text(),"{0}")]]]'.format(id) 
    tds = driver 
       // find row which unique_information contains given id 
       .find_element_by_xpath(xpath) 
       // find all number child td 
       .find_elements_by_css_selector('td.Numbers') 

    numbers = [ td.text * 1 for td in tds] 
    return numbers.sort()[-1] 

findLargestNumInRow('1234') 
+0

Yong, est-ce lié à la troisième colonne? (c'est-à-dire td [3]) Comment cela changerait-il si 1234 pouvait être dans l'une des colonnes? –

+0

Oui, lié à la troisième colonne. Pour effectuer une suite pour toute modification de colonne à // table [@ id = "TableName"]/tbody/tr [td/div/div [contient (text(), "{0}")]] si vous pouvez pré-savoir colonne, il est préférable d'utiliser l'index pour trouver la vitesse – yong

+0

J'ai également résumé le contenu à l'intérieur de la table, donc il y a effectivement beaucoup plus de données complexes, y compris les tables incorporées, etc. div/div implique la structure directe? Désolé, je ne suis pas très bon à XPath. –