3

以下は動作しますが、常に非常に遅く、ページごとに1分間でもスクレイピングプログラムとそのFirefoxまたはChromeブラウザを停止しているようです。

pp recArray = $browser.table(:id,"recordTable").to_a

ただし、HTMLテーブルのテキストまたはhtmlソースの取得は高速です。

htmlcode = $browser.table(:id,"recordTable").html  # .text shows only plaintext portion like lynx

たとえば、そのテーブルのhtmlのみを保持するNokogiriオブジェクトを使用して、同じrecArray(からの各要素)を作成するにはどうすればよいですか?<TR>

recArray = Nokogiri::HTML(htmlcode). ??

4

3 に答える 3

4

私は数日前にそれについてブログ投稿を書きました:http://zeljkofilipin.com/watir-nokogiri/

さらに質問がある場合は、質問してください。

于 2012-05-17T10:45:36.273 に答える
2

テーブルに各trが必要ですか?

Nokogiri::HTML($browser.html).css('table[@id="recordTable"] > tr')

これにより、Arrayよりも便利なNodeSetが得られます。もちろん、to_aはまだあります

于 2012-05-17T10:58:36.183 に答える
1

あちこちのすべてのステップを要約すると便利だと思いました。

問題は、 Watir :: Webdriver Table #to_aが生成する可能性があるが、はるかに高速な、ページのテキストコンテンツから文字列で満たされた同じ配列オブジェクトを生成する方法でした。

 recArray = Nokogiri::HTML(htmlcode). **??**

だから私が以前やっていたようにこれの代わりに:

  recArray=$browser.table(:class, 'detail-table w-Positions').to_a

ページ全体のhtmlを文字列としてNokogiriに送信し、解析を実行させます。

  recArray=Nokogiri::HTML($browser.html).css('table[@class="detail-table w-Positions"] tr').to_a 

これにより、必要なテーブルの行が見つかり、それらを配列に配置しました。

その配列の要素はまだNokogiri(Table Row?)タイプであるため、まだ完了していません。これは、次のようなことを試みたときにバーフ.join(",")されました(たとえば、.CSVファイルやデータベースへの書き込みに便利です)。

したがって、以下は各行要素を繰り返し処理し、それぞれを純粋なRuby文字列型の配列に変換します。この配列には、htmlタグが削除された各テーブルセルのテキストコンテンツのみが含まれます。

 recArray= recArray.map {|row| row.css("td").map {|c| c.text}.to_a }  # Could of course be merged with above to even longer, nastier one-liner

各セルは、以前はノコギリ要素タイプであり、.textマッピングが廃止されていました。

大幅なスピードアップを実現。

次に、Rubyコードファイル内のすべてのWatir ::WebdriverTable#to_aオブジェクトのメソッドをグローバルにオーバーライドするのに何が必要か疑問に思います。

(100%互換性がない可能性があることはわかっていますが、コードの書き換えを大幅に減らすことができます。personal.lib.rbインクルードファイルで試してみてください

于 2012-05-17T12:55:10.273 に答える