1

HPricot の css 検索を使用して、Web ページ内のテーブルを識別しています。これは、私が解析しているサンプルの HTML スニペットです。

<table height=61 width=700>
<tbody>
<tr>
<td><font size=3pt color = 'Blue'><b><A NAME=a1>Some header text</A></b></font></td></tr>
 ...
</tbody></table>

ページにはたくさんのテーブルがあります。参照を含むテーブルを見つけたいA Name=a1。今、私がやっている方法は、

(page/"a[@name=a1]")[0].parent.parent.parent.parent.parent

私はこれが好きではないので

  • 醜いです
  • エラーが発生しやすい (Web ページを維持している人々が tbody を削除した場合はどうなるでしょうか?)

指定された要素のテーブルの祖先を取得するよう hpricot に指示する方法はありますか?

編集: これは私が解析している完全なページです: http://www.blonnet.com/businessline/scoboard/a.htm

私が興味を持っているのは 2 つのテーブルです。1 つは四半期ごとの結果、もう 1 つは年間の結果です。現在、これらのテーブルを抽出する方法は、そこから検索して上に移動することです。

4

2 に答える 2

1

Rohithは正しいです。それは醜く、エラーが発生しやすい (必要以上に)。繰り返しますが、彼が言うように、「テーブルである最も近い親を見つける」という意図ではるかに明確であり、これはあらゆる子/親関係に当てはまります。

hpricotでそれが「不可能」な場合は、そう言ってください。しかし、「とにかくそれをやろうとするのは絶望的だ」とだけ言ってはいけません。それは嘘の答えです。また、同じ質問に対する答えを探している次の人 (私自身) にも役立ちませんが、理由は異なります。これは、違いが想定されており、単に恐れられているだけでなく、多くのページを解析しています。

実際に質問に答えるには... まだわかりません。そして、hpricot を使って発見できる望みはあまりありません。ドキュメントはまったく恐ろしく存在しません。

しかし、これとほぼ同じことを行う回避策があります。

table = (page%"a[@name=a1]").parent
table = table.parent while table.name != "table"
于 2011-09-18T23:13:22.077 に答える
0

ページ全体を見ないと決定的な答えを出すのは難しいですが、多くの場合、あなたのやり方が正しい答えです。適切なランドマークを見つけて、そこからナビゲートする必要があります。チェーンをバックアップする必要がある場合は、それを行う必要があります。

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

于 2010-10-23T09:28:19.940 に答える