0

watir-webdriverを使用して、ネストされたテーブルベースのレイアウトのページからスクレイプしています。例として、私はhttp://veryslow.staticloud.com/に非常に小さなおもちゃのサイトを構築しました。ソ連とブラジルの要素を含む最も内側のテーブルを検索するには、次のコードを使用します。

require "rubygems"
require "watir-webdriver"
r = Watir::Browser.new
br.goto("http://veryslow.staticloud.com/")
reg = /USSR.+Brazil/m
mytable = br.table(:text,reg).table(:text,reg).table(:text,reg).table(:text,reg).table(:text, reg).table(:text, reg)
mytable.text

2つの質問があります:

  1. これらの内部テーブルを検索するためのより良い方法はありますか?
  2. なんでこんなに遅いの?実際にテーブルを見つけるには(私が電話したときに実行されますmytable.text)、かなりの時間がかかります。ネストされたテーブルベースのレイアウトを持つ複雑なWebサイトの場合、これは非常に長くなります。

ネストされたテーブルのデザインは悪い考えですが、それらから読み取る必要がある場合、それを行うためのより速い方法はありますか?

4

5 に答える 5

1

これまでのところ、既知のページ構造に対してxpathがより良い方法であることがわかりました。だから、

mytable = br.table(:xpath,"/html/body/table/tbody/tr[3]/td/table/tbody/tr[3]/td/table[2]/tbody/tr/td/table/tbody/tr/td[2]/table/tbody/tr[3]/td[3]/table")

通常ははるかに高速です。

于 2011-06-18T00:49:28.527 に答える
1

開発者に、少なくとも位置などに基づいて、テーブル、行、またはセルに名前またはクラスを割り当てさせる機会はありますか?またはその場所でのその機能?そうすれば、物事をはるかにテストしやすくなると思います。そうすれば、クラス「originating_city」とテキスト「NewYork」などのセルをそのまま検索するようなことができます。テスト用の地雷原があります。物事をテスト可能にするための開発者の協力を得ることはできません。私はあなたの履歴書を真剣に更新し、彼らが炎上する前に新しいポジションを探し始めます。

特定の例では、テーブル全体にソ連を含むセルが1つしかないため、.parentを使用してみてください。ただし、ブラジルなどの他の都市名ではうまく機能しません。

それから、あなたの現在の正規表現主導のアプローチが、その組み合わせの一部が一意ではなかったそのページで可能だった他の都市の組み合わせで機能するかどうかは疑問です。

于 2011-06-18T05:31:37.180 に答える
1

正規表現を使用して要素を検索する場合は常に、ブラウザー自体ではなく、Ruby側でフィルタリングを実行する必要があります。つまり、ここで.table(:text、reg)を呼び出すたびに、含まれている要素内のすべてのテーブルが検索され、Rubyでフィルター処理されて、正規表現に一致するテーブルが検索されます。特にこのようなページでは、それは遅くなります。

于 2011-07-02T23:59:14.010 に答える
0

テキストを探している場合は、一番上のテーブルからテキスト全体を読み取り、探しているものに解析することができます。これにより、空のテーブルセルを識別できないことに気付くまで、テーブル検索のオーバーヘッドを大幅に削減できました。今はゆっくりと実行する必要がありますが、表示されたテキスト。

そうでなければ...そうではありません。何かが外部テーブルから除外される内部テーブル(またはその親/子)を定義しない限り、それを識別するのは困難です。

于 2011-06-20T08:57:23.133 に答える
0

テーブルを見つけることができる属性を見つけることができるかどうかを確認してください。

mytable = br.table(:xpath、 "/ html / body / table / tbody / tr [3] / td / table / tbody / tr [3] / td / table [2] / tbody / tr / td / table / tbody / tr / td [2] / table / tbody / tr [3] / td [3] / table ")

mytable = br.table(:xpath、 "// table [@ name ='sometablename']")のように書くと、はるかにうまく機能し、もろくなりません。

UI要素には、たとえば更新時にid ='xyz12345'がid='abc475843'に変更されるなど、ページが更新されるたびに変更される動的IDが含まれる傾向があります。この場合、NokogiriまたはHpricotを使用してbr.htmlを解析することで速度を上げることができます(ただし、HpricotよりもNokogiriが優先されます)。

于 2011-07-08T23:27:21.760 に答える