我有一个页面,其中包含一个包含大量项目的选择列表。
我想获取它包含的所有项目(作为String对象)并将它们粘贴到数组中。
Select#options返回一个OptionsCollection,这意味着到目前为止我能想出的最好的是:
text_array = my_huge_select_list.options.map { |opt| opt.text }
......但是,哇,这太慢了!
有没有更快的方法来做同样的事情?
答案 0 :(得分: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
答案 1 :(得分:1)
对于包含450个选项的选择列表,手动解析html会将时间从113秒缩短(使用Watir映射选项文本时)到16秒。
这是通过以下命令完成的:
text_array = browser.select_list.html.scan(/<option[^>]*?>(.*?)<\/option>/i).flatten
有关正则表达式的几点注意事项:
[^>]*?
用于处理元素上的任何属性。如果你知道没有,可以省略它。i
参数设置为不区分大小写。在Firefox和Chrome中,html中的元素将为小写。但是,IE将它们资本化。风险:
它不漂亮,但它似乎比通过Watir的选项集合收集文本更快。然而,它并不比Nokogiri快3秒。