vind eerste klas kinderen in nokogiri-rails

Ik heb te maken gehad met een probleem om kinderen van het eerste niveau uit het huidige element te vinden? Ik heb bijvoorbeeld html:

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

Ik gebruik Nokogiri voor rails:

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

Het geeft alle tr terug binnen de tabel . Maar ik heb slechts 2 nodig dat eerste niveau voor de tafel.

12

4 antwoord

Wanneer je dit zegt:

table = page.css('table')

je grijpt beide tafels in plaats van alleen de bovenste niveautafel. U kunt dus terugkeren naar de hoofdmap van het document en een selector gebruiken die alleen overeenkomt met de rijen in de eerste tabel zoals Mosch zegt of u kunt tabel als de buitenste tabel repareren met zoiets als dit:

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

of zelfs dit (afhankelijk van de echte structuur van de HTML):

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

of misschien een van deze voor tabel (bedankt Phrogz, nogmaals):

table = page.at('table')
table = page.at_css('table')
# or various other CSS and XPath incantations
21
toegevoegd
Misschien wilt u page.at ('table') of page.at_css ('table') vermelden in plaats van page.css ('table'). eerste .
toegevoegd de auteur Phrogz, de bron
@Phrogz: Bedankt, ik gooide ook die in de mix.
toegevoegd de auteur mu is too short, de bron
@pguardiario: Ik zat te wachten totdat zoiets zou gebeuren, ik wilde er gewoon niet verantwoordelijk voor zijn :) Je zou dat als een antwoord kunnen weggooien (na het toevoegen van de /tr , < code> page.xpath ('// tabel [niet (voorouder :: * [1] [naam() = "tabel"])]/tr' & zwnj;) ), een beetje van XPath deed nooit pijn iedereen.
toegevoegd de auteur mu is too short, de bron
Met het risico om het te ver te nemen: page.xpath ('// table [not (ancestor :: * [1] [name() = "table"])]')
toegevoegd de auteur pguardiario, de bron

Je kunt doen

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

Misschien moet je de selector aanpassen aan je containerelement (ik koos hier 'body')

5
toegevoegd
Inderdaad, bedankt! Bewerkt het antwoord.
toegevoegd de auteur moritz, de bron
Nee, omdat u in dit geval ook tr-element hebt geselecteerd dat in de binnentabel is genest
toegevoegd de auteur WarHog, de bron
Je kunt ook table.css ('> tr') doen om de directe afstammeling van de tafel te krijgen
toegevoegd de auteur Eric B, de bron

Als nog een andere manier, kunt u proberen om zoiets als dit te gebruiken:

text = <

In dit voorbeeld vertegenwoordigt '/ table/tr' uitdrukking een absoluut pad naar het vereiste element - 'tr' in ons geval.

1
toegevoegd
aangezien dit html is, wil je echt Nokogiri :: HTML gebruiken. Ook breekt de trash schuine streep in uw xpath.
toegevoegd de auteur pguardiario, de bron
Oeps, dit zijn een paar mijn typefouten - je hebt helemaal gelijk, mijn verontschuldigingen :)
toegevoegd de auteur WarHog, de bron

xpath werkte niet voor mij

De onderstaande code werkte prima voor mij.

table = page.css('table')
table.css('> tr')
0
toegevoegd