我有一个包含大量项目的选择列表的页面。
我想获取它包含的所有项目(作为字符串对象)并将它们粘贴到一个数组中。
Select#options 返回一个 OptionsCollection,这意味着到目前为止我能想到的最好的方法是:
text_array = my_huge_select_list.options.map { |opt| opt.text }
......但是,哇,那是不是很慢!
有没有更快的方法来做同样的事情?
我有一个包含大量项目的选择列表的页面。
我想获取它包含的所有项目(作为字符串对象)并将它们粘贴到一个数组中。
Select#options 返回一个 OptionsCollection,这意味着到目前为止我能想到的最好的方法是:
text_array = my_huge_select_list.options.map { |opt| opt.text }
......但是,哇,那是不是很慢!
有没有更快的方法来做同样的事情?
诚然,这不是基准测试(我很好奇该选择列表中有多少选项),但您可能会使用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
对于具有 450 个选项的选择列表,手动解析 html 将时间从 113 秒(同时使用 Watir 映射选项文本)减少到 16 秒。
这是通过以下命令完成的:
text_array = browser.select_list.html.scan(/<option[^>]*?>(.*?)<\/option>/i).flatten
关于正则表达式需要注意的几点:
[^>]*?
用于处理元素上的任何属性。如果您知道没有,则可以省略。i
。在 Firefox 和 Chrome 中,html 中的元素将是小写的。但是,IE 将它们大写。风险:
它并不漂亮,但它似乎确实比通过 Watir 的选项集合收集文本要快。但是,它并不比 Nokogiri 快,后者是 3 秒。