我有以下HTML:
<select name="ctl00$cp$cbDzien" id="ctl00_cp_cbDzien" onchange="cbDzienGodzina_onChange(this);" style="width:200px;">
<option value="-1"></option>
<option value="2013-10-07">2013-10-07</option>
<option value="2013-10-08">2013-10-08</option>
<option value="2013-10-09">2013-10-09</option>
<option value="2013-10-10">2013-10-10</option>
<option value="2013-10-11">2013-10-11</option>
<option value="2013-10-14">2013-10-14</option>
<option value="2013-10-15">2013-10-15</option>
<option value="2013-10-16">2013-10-16</option>
<option value="2013-10-17">2013-10-17</option>
<option value="2013-10-18">2013-10-18</option>
<option value="2013-10-23">2013-10-23</option>
<option value="2013-10-24">2013-10-24</option>
<option value="2013-10-25">2013-10-25</option>
<option value="2013-10-28">2013-10-28</option>
<option value="2013-10-29">2013-10-29</option>
<option value="2013-10-31">2013-10-31</option>
</select>
我的代码:
@get_doc = Nokogiri::HTML(page)
@get_doc .at_css("select#ctl00_cp_cbDzien").each do |d|
puts d[value]
end
但是,我没有看到这些代码的选项,我还需要在我的示例中选择last-1值(2013-10-29)。我怎么能这样做?
答案 0 :(得分:2)
您没有根据需要编码。这是:
require 'nokogiri'
doc = Nokogiri::HTML.parse <<-eot
<select name="ctl00$cp$cbDzien" id="ctl00_cp_cbDzien" onchange="cbDzienGodzina_onChange(this);" style="width:200px;">
<option value="-1"></option>
<option value="2013-10-07">2013-10-07</option>
<option value="2013-10-08">2013-10-08</option>
<option value="2013-10-09">2013-10-09</option>
<option value="2013-10-10">2013-10-10</option>
<option value="2013-10-11">2013-10-11</option>
<option value="2013-10-14">2013-10-14</option>
<option value="2013-10-15">2013-10-15</option>
<option value="2013-10-16">2013-10-16</option>
<option value="2013-10-17">2013-10-17</option>
<option value="2013-10-18">2013-10-18</option>
<option value="2013-10-23">2013-10-23</option>
<option value="2013-10-24">2013-10-24</option>
<option value="2013-10-25">2013-10-25</option>
<option value="2013-10-28">2013-10-28</option>
<option value="2013-10-29">2013-10-29</option>
<option value="2013-10-31">2013-10-31</option>
</select>
eot
doc.css('#ctl00_cp_cbDzien option').each do |node|
puts node['value']
end
# >> -1
# >> 2013-10-07
# >> 2013-10-08
# >> 2013-10-09
# >> 2013-10-10
# >> 2013-10-11
# >> 2013-10-14
# >> 2013-10-15
# >> 2013-10-16
# >> 2013-10-17
# >> 2013-10-18
# >> 2013-10-23
# >> 2013-10-24
# >> 2013-10-25
# >> 2013-10-28
# >> 2013-10-29
# >> 2013-10-31
要获取您需要执行的最后一个值:
doc.css('#ctl00_cp_cbDzien option').last['value']
# => "2013-10-31"
要获得您需要做的第二个最后一个值:
doc.css('#ctl00_cp_cbDzien option')[-2]['value']
# => "2013-10-29"
现在看看,为什么你的代码不会打印出预期的结果。
doc.css('#ctl00_cp_cbDzien').size
# => 1
doc.css('#ctl00_cp_cbDzien')[0].name
# => "select"
doc.css('#ctl00_cp_cbDzien')
会Nokogiri::XML::NodeSet
只有一个Nokogiri::XML::Node
,这是您的select
元素。现在可以获得所有Nokogiri::XML::NodeSet
option
} elements,您需要更改选择器规则,如下所示:
doc.css('#ctl00_cp_cbDzien option').size
# => 17
doc.css('#ctl00_cp_cbDzien option').all?{|nd| nd.name == 'option'}
# => true
以上true
值表示Nokogiri::XML::NodeSet
创建的doc.css('#ctl00_cp_cbDzien option')
包含所有选项元素Nokogiri::XML::Node
。
可以使用at_css
或at_xpath
编写好的一行内容,如下所示:
doc.at_css('#ctl00_cp_cbDzien option:nth-last-child(2)')['value']
# => "2013-10-29"
doc.at_xpath("//select[@id='ctl00_cp_cbDzien']/option[last()-1]")['value']
# => "2013-10-29"
答案 1 :(得分:1)
Nokogiri的each
method遍历节点的属性,而不是元素子元素。要选择select的所有option
子项,您需要使用此CSS:
@get_doc.css("select#ctl00_cp_cbDzien option").each do |d|
# ...
(请注意,这使用css
而不是at_css
来获取所有option
个节点。)
使用Nokogiri,您可以使用伪类直接获取倒数第二个子节点:
@get_doc.at_css("select#ctl00_cp_cbDzien option:nth-last-child(2)")
这使用了Nokogiri实施的nth-last-child
selector。
答案 2 :(得分:0)
@get_doc .at_css("select#ctl00_cp_cbDzien")
为您提供父节点<select>
。听起来你想要访问它的一个孩子。使用children
方法。
@get_doc.at_css('select#ctl00_cp_cbDzien').children.each { |d| puts d }
#=><option value="-1"></option>
<option value="2013-10-07">2013-10-07</option>
<option value="2013-10-08">2013-10-08</option>
<option value="2013-10-09">2013-10-09</option>
<option value="2013-10-10">2013-10-10</option>
<option value="2013-10-11">2013-10-11</option>
<option value="2013-10-14">2013-10-14</option>
<option value="2013-10-15">2013-10-15</option>
<option value="2013-10-16">2013-10-16</option>
<option value="2013-10-17">2013-10-17</option>
<option value="2013-10-18">2013-10-18</option>
<option value="2013-10-23">2013-10-23</option>
<option value="2013-10-24">2013-10-24</option>
<option value="2013-10-25">2013-10-25</option>
<option value="2013-10-28">2013-10-28</option>
<option value="2013-10-29">2013-10-29</option>
<option value="2013-10-31">2013-10-31</option>
答案 3 :(得分:0)
我的Nokogiri有点生锈,但不会是:
length = doc.css('#ctl00_cp_cbDzien option').to_a.count
last_element_minus_one = doc.css('#ctl00_cp_cbDzien option').to_a[length-2]
value = last_element_minus_one["value"]
-2
用于查找倒数第二个元素。