2011-10-27 8 views
10

現在の要素から第1レベルの子供を見つける方法に問題があったのですか? 例えば、私はhtmlの持っている:ノコギリレールの第1レベルの子供を見つける

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

を私はレールのための鋸山を使用しています:

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

それは、table内のすべてのtrを返します。 しかし、テーブルの最初のレベルは2つだけ必要です。

答えて

19

あなたがこれを言う:

table = page.css('table') 

あなたは、両方のテーブルだけではなく、トップレベルのテーブルをつかみました。だから、ドキュメントルートに戻ってmoschが言うように最初のテーブルの行と一致するセレクタを使用するか、あなたはこのような何かを持つ唯一の外のテーブルであることをtableを修正することができ、次のいずれか

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

かでもこの(HTMLの実際の構造に応じて):tableため

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

または、おそらくこれらの1(おかげPhrogz、再び):

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

'page.at( 'table')'や 'page.at_css(' table ') ' page.css( 'table')。最初に '。 – Phrogz

+0

@Phrogz:ありがとう、私もミックスにそれらを投げた。 –

+0

あまりにも遠すぎる危険性があります:page.xpath( '// table [(ancestor :: * [1] [name()= "table"])]) – pguardiario

5

あなたはおそらく、あなたはまだ別の方法として(私はここでは「身体」を選択しました)あなたのコンテナ要素に

+0

いや、このCA理由あなたはまた、内部テーブル – WarHog

+0

にネストされたtr要素を選択しました本当に、ありがとう!答えを編集しました。 – moritz

+1

テーブル –

1

をセレクタを適応する必要が

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

を行うことができ、あなたはこのようなものを使用しようとすることができます:

text = <<HERE 
    <table> 
    <tr>abc</tr> 
    <tr>def</tr> 
    <table> 
     <tr>second</tr> 
    </table> 
    </table> 
HERE 
xml = Nokogiri::XML(text) 
xml.xpath("/table/tr/").each do |node| 
    puts node.text 
end 

この例では、 '/ table/tr'式は、必要な要素の絶対パス、この場合は「tr」を表します。

+0

の直接の子孫を得るために 'table.css( '> tr')'を実行することもできます。これは実際にはNokogiri :: HTMLを使いたいからです。また、あなたのxpathの末尾にスラッシュが入っています。 – pguardiario

+0

おっと、これらは私のタイプミスです。あなたは完璧ですよ、私の謝罪です。 – WarHog

関連する問題