2011-10-27 8 views
10

Ho riscontrato un problema su come trovare i bambini di primo livello dall'elemento corrente? Per esempio io ho html:trovare bambini di primo livello in rotaie nokogiri

<table> 
    <tr>abc</tr> 
    <tr>def</tr> 
    <table> 
    <tr>second</tr> 
    </table> 
</table> 

Sto usando Nokogiri per le rotaie:

table = page.css('table') 
table.css('tr') 

Esso restituisce tutto tr all'interno table. Ma ho bisogno solo di 2 quel primo livello per il tavolo.

risposta

19

Quando si dice questo:

table = page.css('table') 

si sta afferrando entrambe le tabelle piuttosto che solo il tavolo di livello superiore. Così si può andare di nuovo alla radice del documento e utilizzare un selettore che corrisponde solo le righe nella prima tabella come dice Mosch o si può risolvere table di essere solo la tabella esterna con qualcosa di simile:

table = page.css('table').first 
trs = table.xpath('./tr') 

o anche questo (a seconda struttura reale del HTML):

table = page.xpath('/html/body/table') 
trs = table.xpath('./tr') 

o forse uno di questi per table (grazie Phrogz, ancora una volta):

table = page.at('table') 
table = page.at_css('table') 
# or various other CSS and XPath incantations 
+2

Puoi menzionare 'page.at ('table')' o 'page.at_css ('table')' invece di ' page.css ('table'). FIRST'. – Phrogz

+0

@Phrogz: Grazie, ho buttato anche quelli nel mix. –

+0

A rischio di portarlo troppo lontano: page.xpath ('// table [non (ancestor :: * [1] [name() = "table"])]') – pguardiario

5

Si può fare

rows = page.css('body > table > tr') 

Forse si deve adattare il selettore al vostro elemento contenitore (ho scelto 'corpo' qui)

+0

No, perché questo ca se hai anche selezionato tr elemento annidato nella tabella interna – WarHog

+0

Infatti, grazie! Modificato la risposta. – moritz

+1

Si può anche fare 'table.css ('> tr')' per ottenere il discendente diretto della tabella –

1

Come ancora un altro modo, si può provare a usare qualcosa di simile :

In questo esempio, l'espressione '/ table/tr' rappresenta un percorso assoluto per l'elemento richiesto - 'tr' nel nostro caso.

+0

poiché questo è html, si vuole veramente usare Nokogiri :: HTML. Anche la barra finale nel tuo xpath la rompe. – pguardiario

+0

Oops, questi sono un paio dei miei refusi - hai perfettamente ragione, le mie scuse :) – WarHog

Problemi correlati