0

非常に多くのアイテムを含む選択リストを含むページがあります。

含まれているすべてのアイテムを (文字列オブジェクトとして) 取得し、それらを配列に貼り付けたいと考えています。

Select#options は OptionsCollection を返します。これは、これまでに思いついた最高のものは次のとおりであることを意味します。

text_array = my_huge_select_list.options.map { |opt| opt.text }

...しかし、うわー、それはこれまでにないほど遅いです!

同じことを行うためのより速い方法はありますか?

4

2 に答える 2

1

450 個のオプションを含む選択リストの場合、html を手動で解析すると、(Watir を使用してオプション テキストをマップしている間) 113 秒から 16 秒に短縮されました。

これは、次のコマンドで実行されました。

text_array = browser.select_list.html.scan(/<option[^>]*?>(.*?)<\/option>/i).flatten

正規表現について注意すべき点がいくつかあります。

  • [^>]*?開始オプション タグの は、要素の属性を処理するために使用されます。何もないことがわかっている場合は省略できます。
  • 正規表現は、パラメーターによって大文字と小文字が区別されなくなりiます。Firefox と Chrome では、html の要素は小文字になります。ただし、IE はそれらを大文字にします。

リスク:

  • オプションにテキストのみが含まれていることを前提としています。オプションに html 要素がある場合は機能しますが、手動での解析がさらに必要になります。
  • オプションに終了タグがあると仮定します。終了タグが欠落している場合、IE は自動的に終了タグを追加しないと思います。終了タグがない場合は、正規表現を変更する必要がある場合があります。

きれいではありませんが、Watir のオプション コレクションを介してテキストを収集するよりも高速に思えます。ただし、3秒だったノコギリよりは速くありません。

于 2013-09-09T20:06:24.633 に答える
1

確かに、これはベンチマークではありません (そして、その選択リストにいくつのオプションがあるのか​​知りたいです) が、潜在的にNokogiriを使用できます。

これは不自然な選択リストです。最初に、選択リスト内のオプションがcssメソッドを介して取得されます。次に、各オプションのテキストがtext_array配列に追加されます。その時点で、text_array文字列の配列です。

require 'nokogiri'

doc = Nokogiri::HTML <<DOC
<select id="list">
  <option value="AL">AL</option>
  <option value="AK">AK</option>
  <option value="AS">AS</option>
  <option value="AZ">AZ</option>
<select>
DOC

options = doc.css("select option")
text_array = []
options.each { |opt| text_array << opt.text}

text_array[0]
# =>  AL
text_array[0].class
# =>  String
于 2013-09-06T22:23:05.200 に答える