ノコギリレールで一流の子供を見つける

私は現在の要素から第一レベルの子供を見つける方法の問題に直面しましたか? たとえば、私はhtmlを持っています:

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

私はノコギリをレールに使用しています:

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

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

12

4 答え

あなたがこれを言うとき:

table = page.css('table')

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

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

これはHTMLの実際の構造に依存します:

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

またはおそらく table (これはPhrogzに感謝します)のためのものです。

table = page.at('table')
table = page.at_css('table')
# or various other CSS and XPath incantations
21
追加された
page.css( 'table')の代わりに page.at( 'table')または page.at_css( 'table')について言及することもできます。最初の。
追加された 著者 Phrogz,
@Phrogz:ありがとう、私もミックスにそれらを投げた。
追加された 著者 mu is too short,
@pguardiario:私はそのようなことが起こるのを待っていましたが、私は責任を負うことを望んでいませんでした:)あなたは答えとしてそれを投げ捨てることができます(後に/tr XPathのビットは決して傷つくことはありません(つまり、 page.xpath( '// table [not(ancestor :: * [1] [name()= "table"])]/tr'&zwnj;)誰でも。
追加された 著者 mu is too short,
あまりにも遠すぎる危険性があります:page.xpath( '// table [(ancestor :: * [1] [name()= "table"])]')
追加された 著者 pguardiario,

できるよ

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

おそらく、セレクタをコンテナ要素に適合させる必要があります(私はここで 'body'を選択しました)

5
追加された
確かに、ありがとう!答えを編集しました。
追加された 著者 moritz,
いいえ、この場合、内部テーブルにネストされたtr要素も選択したためです
追加された 著者 WarHog,
table.css( '> tr')を実行して、テーブルの直接の子孫を取得することもできます
追加された 著者 Eric B,

さらに別の方法として、次のようなものを使うことができます:

text = <

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

1
追加された
これはhtmlであるため、実際にNokogiri :: HTMLを使いたいと思っています。また、あなたのxpathの末尾にスラッシュが入っています。
追加された 著者 pguardiario,
おっと、これらは私のタイプミスです - あなたは完璧です、私の謝罪です:)
追加された 著者 WarHog,

xpathが機能しませんでした

以下のコードは私のためにうまくいきました。

table = page.css('table')
table.css('> tr')
0
追加された