1

我有以下 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

4 回答 4

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元素,你需要更改选择器规则,如下所示:

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"
于 2013-10-05T19:02:29.177 回答
1

Nokogiri 的each方法迭代节点的属性,而不是子元素。要选择 select 的所有option子项,您需要使用此 CSS:

@get_doc.css("select#ctl00_cp_cbDzien option").each do |d|
  # ...

(注意这使用cssnot at_css, 来获取所有option节点。)

使用 Nokogiri 您可以使用伪类直接获取倒数第二个子节点:

@get_doc.at_css("select#ctl00_cp_cbDzien option:nth-last-child(2)")

这使用了Nokogiri 已经实现的nth-last-child选择器。

于 2013-10-05T19:04:39.363 回答
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>
于 2013-10-05T19:04:07.907 回答
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用于查找倒数第二个元素。

于 2013-10-05T19:13:03.073 回答