2012-02-27 11 views
5

Ho questo codice:Come selezionare il genitore basato sul figlio in lxml?

<table cellspacing="1" cellpadding="1" border="0"> 
    <tbody> 
    <tr> 
    <td>Something else</td> 
    </tr> 
    <tr> 
    <td valign="top"> 
     <a href="http://exact url">Something</a> 
    </td> 
    <td valign="top">Something else</td> 
    </tr> 
    </tbody> 
</table> 

Voglio trovare il tavolo, ma è molto difficile da destinarli (lo stesso codice viene utilizzato come 10 volte). Ma so cosa c'è nell'URL. Come posso ottenere la tabella genitore?

risposta

4

Se t è la etree per questo frammento di XML, allora il link che stai cercando è

t.xpath('//a[@href = "http://exact url"]')[0] 

Da lì, si può arrivare al table utilizzando l'asse ancestor:

t.xpath('//a[@href = "http://exact url"]/ancestor::table')[-1] 
+0

larsman: l'ultima riga della tua risposta otterrà il 'tavolo' più esterno di tutte le tabelle con l'elemento' a' desiderato discendente. Penso che l'OP abbia bisogno del tavolo più interno. –

+0

@DimitreNovatchev: hai ragione, avrei dovuto prendere l'ultimo elemento della lista. Risolto adesso, grazie! –

+0

larsmans: Wow - indice di valore -1 ... Che lingua è questa? –

0

//a[@href="http://exact url"]/../../..

Avrete bisogno di 3 .. s per raggiungere l'elemento di tabella.

+0

Questo è un elemento 'td'. –

+0

Ha, l'aveva già risolto quando hai commentato. – beerbajay

+0

Ah. Ancora, non una soluzione particolarmente carina o generale. –

2

Filtra le tabelle utilizzando []. Si noti che l'attributo è un nipote //table[.//@href="blah"]

O //a[@href="blah"]//ancestor::table

2

Una soluzione XPath pura.

Uso:

(//a[@href = "http://exact url"])[1]/ancestor::table[1] 

Questo seleziona il primo antenato table del primo a elemento nel documento XML, il valore di stringa di cui href attributo è la stringa "http://exact url".

Questo fornisce la corretta table elemento anche nel caso in cui vi sono tabelle ciascuno dei quali ha il voluto a elemento come discendente annidata. In questo caso l'espressione XPath sopra seleziona il più interno - contrariamente alla risposta attualmente accettata, che ottiene lo più esternotable antenato.

Problemi correlati