0

我有一个包含大量项目的选择列表的页面。

我想获取它包含的所有项目(作为字符串对象)并将它们粘贴到一个数组中。

Select#options 返回一个 OptionsCollection,这意味着到目前为止我能想到的最好的方法是:

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

......但是,哇,那是不是很慢!

有没有更快的方法来做同样的事情?

4

2 回答 2

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 回答
1

对于具有 450 个选项的选择列表,手动解析 html 将时间从 113 秒(同时使用 Watir 映射选项文本)减少到 16 秒。

这是通过以下命令完成的:

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

关于正则表达式需要注意的几点:

  • 开始选项标签中的[^>]*?用于处理元素上的任何属性。如果您知道没有,则可以省略。
  • 参数使正则表达式不区分大小写i。在 Firefox 和 Chrome 中,html 中的元素将是小写的。但是,IE 将它们大写。

风险:

  • 假设该选项仅包含文本。如果选项中有 html 元素,它会起作用,但需要更多的手动解析。
  • 假设您的选项有结束标签。我相信如果缺少结束标签,IE 不会自动添加结束标签。如果您没有结束标签,您可能需要修改正则表达式。

它并不漂亮,但它似乎确实比通过 Watir 的选项集合收集文本要快。但是,它并不比 Nokogiri 快,后者是 3 秒。

于 2013-09-09T20:06:24.633 回答