2012-02-27 11 views
5

mam ten kod:Jak wybrać rodzica na podstawie dziecka w 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> 

Chcę znaleźć stolik, ale jest bardzo ciężko, aby ją uaktywnić (ten sam kod jest używany jak 10 razy). Ale wiem, co jest w adresie URL. Jak mogę uzyskać tabelę nadrzędną?

Odpowiedz

4

Jeśli t jest etree dla tego fragmentu XML, a następnie link szukasz jest

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

Stamtąd można dostać się do table pomocą oś ancestor:

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

larsmans: Ostatnia linia w twojej odpowiedzi otrzyma najbardziej zewnętrzną "tabelę" wszystkich tabel z potomkiem pożądanego elementu "a". Uważam, że PO potrzebuje najbardziej wewnętrznej tabeli. –

+0

@DimitreNovatchev: masz rację, powinienem wziąć ostatni element listy. Naprawiono teraz, dzięki! –

+0

larsmans: Wow - wartość indeksu -1 ... Jaki to jest język? –

0

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

Musisz 3 .. s dotrzeć do elementu tabeli.

+0

To jest element 'td'. –

+0

Ha, naprawiliśmy to już po skomentowaniu. – beerbajay

+0

Ah. Nadal nie jest to szczególnie ładne lub ogólne rozwiązanie. –

2

Filtruj tabele za pomocą []. Należy zauważyć, że atrybut jest wnuk //table[.//@href="blah"]

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

2

Czyste rozwiązanie XPath.

Zastosowanie:

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

ten wybiera pierwszy przodek table pierwszego a elementem dokumentu XML, wartość ciągu o której href atrybut jest ciągiem "http://exact url".

To zapewnia prawidłową table element, nawet w przypadku, gdy nie są zagnieżdżone tabele, z których każdy ma chcieliśmy a element jako potomka. W tym przypadku powyższe wyrażenie XPath wybiera najgłębszy taki table - w przeciwieństwie do obecnie akceptowanej odpowiedzi, która uzyskuje najbardziej zewnętrzny przodek table.

Powiązane problemy