Nokogiri选择last-1选项值

时间:2013-10-05 18:43:18

标签: ruby select nokogiri

我有以下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)。我怎么能这样做?

4 个答案:

答案 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_cssat_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用于查找倒数第二个元素。