1

I have the following 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>

My code:

@get_doc = Nokogiri::HTML(page)
@get_doc .at_css("select#ctl00_cp_cbDzien").each do |d|
    puts d[value]
  end

However, I didn't see options with such code, and I also need to select last-1 value (2013-10-29) in my example. How can I do this?

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"

最後から 2 番目の値を取得するには、次の操作を行う必要があります。

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::NodeselectNokogiri::XML::NodeSetoption

doc.css('#ctl00_cp_cbDzien option').size
# => 17
doc.css('#ctl00_cp_cbDzien option').all?{|nd| nd.name == 'option'}
# => true

上記のtrue値は、Nokogiri::XML::NodeSetcreated bydoc.css('#ctl00_cp_cbDzien option')がすべてのオプション要素を として含んでいることを示していますNokogiri::XML::Node

良いワンライナーは、at_cssorat_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|
  # ...

(これはcssnotat_cssを使用してすべてのoptionノードを取得することに注意してください。)

Nokogiri を使用すると、最後から 2 番目の子ノードを疑似クラスで直接取得できます。

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

これはNokogiri が実装したnth-last-childselectorを使用します。

于 2013-10-05T19:04:39.363 に答える
0

@get_doc .at_css("select#ctl00_cp_cbDzien")親ノード が表示されます<select>。その子の 1 つにアクセスしたいようです。メソッドを使用し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

私の鋸は少し錆びていますが、そうではないでしょうか:

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、最後から 2 番目の要素を見つけるために使用されます。

于 2013-10-05T19:13:03.073 に答える