私はxpathを持っています
page.search("//table[@class='campaign']//table")
2 つのテーブルを返します。
最初のテーブルのみを選択する必要があります。この行は機能しません:
page.search("//table[@class='campaign']//table[1]")
最初のテーブルのみを選択するには?
これも私を悩ませました。なぜあなたのソリューションが機能しないのか、まだ正確にはわかりません。ただし、これは次のようにする必要があります。
page.search("//table[@class='campaign']/descendant::table[1]")
編集:ドキュメントが言うように、
「ロケーション パス
//para[1]
は、ロケーション パスと同じ意味ではありません/descendant::para[1]
。後者は最初の子孫パラ要素を選択します。前者は、親の最初のパラ子であるすべての子孫パラ要素を選択します。」
あなたの質問のおかげで、なぜこれがこのように機能するのかがようやくわかりました:)。したがって、構造とニーズに応じて、これは機能するはずです。
最初に一致する要素を選択するために XPath 式を使用する代わりに、それらすべてを見つけてから切り詰めることができます。
first_table = page.search("//table[@class='campaign']//table").first
...またはさらに良いことに、次を使用して最初のものだけを選択しますat
。
first_table = page.at("//table[@class='campaign']//table")
CSS セレクター構文を使用すると、式をより簡単に見つけることができることにも注意してください。
first_table = page.at("table.campaign table")