ページ全体を見ないと決定的な答えを出すのは難しいですが、多くの場合、あなたのやり方が正しい答えです。適切なランドマークを見つけて、そこからナビゲートする必要があります。チェーンをバックアップする必要がある場合は、それを行う必要があります。
XPATH を使用してテーブルを見つけ、その中からリンクを探すことができるかもしれませんが、実際には状況が改善されるわけではなく、変更されるだけです。Firefox プラグインである Firebug を使用すると、ページ内の要素への XPATH を簡単に取得できるため、問題のテーブルを見つけて Firebug にパスを表示させるか、xpath のノードを右クリックしてコピーするだけです。表示し、それをルックアップに渡します。
「醜い」かもしれませんが、すべての問題が美しいまたはエレガントなソリューションに役立つわけではないため、すべてのコードが美しいまたはエレガントであるとは限りません。「うまくいった」と喜ぶこともある。それが確実に機能し、その理由を知っている限り、他の多くのコーダーよりも優れています.
「... Web ページを維持している人々が tbody を削除したらどうなるでしょうか?」、HTML または XML のほとんどすべての構文解析は、ソースを制御できないため、同じ懸念に悩まされます。できる限り最善を尽くしてコードを記述し、コンテンツが変更された場合に失敗する可能性が高い箇所にコメントを付けてから、指を交差させて先に進みます。TPS レポートから表形式のデータを解析している場合でも、同じ問題が発生する可能性があります。
私が別の方法で行うことをお勧めする唯一のことは、 (AKA 検索)%
の代わりに (AKA "at")を使用することです。インデックスを削除できるように、最初のオカレンスのみを返します。/
%
[0]
(page%"a[@name=a1]").parent.parent.parent.parent.parent
また
page%'//a[@name="a1"]/../../../../../..'
これは、XPath エンジンを使用してチェーンを遡ります。速度を考慮すれば、もう少し速くなるはずです。
ターゲット テーブルがその幅と高さを持つ唯一のテーブルであることがわかっている場合は、より具体的な xpath を使用できます。
page%'//table[@height=61 and @width=700]'
Hpricotよりもノコギリがオススメです。
ドキュメントの上から下に向かって XPath を使用することもできます。
irb(main):039:0> print (doc/'//body/table[2]/tr/td[2]/table[2]').to_html[0..100]
<table height="61" width="700"><tbody>
<tr><td width="700" colspan="7" align="center"> <font size="3p=> nil
基本的に、XPath パターンは次のことを意味します。
body タグ、3 番目のテーブル、その行の 3 番目のセルを見つけます。セルで 3 番目のテーブルを見つけます。
注: Firefox は、<tbody>
受け取った HTML ファイルにタグがなかったとしても、ソースにタグを自動的に追加します。Firefox を使用してソースを表示し、独自の XPath を開発しようとすると、本当に混乱する可能性があります。
あなたが求めている他の表は/html/body/table[2]/tbody/tr/td[2]/table[3]
Firefox によるものなので、tbody
. また、でアンカーする必要はありません/html
。