0

私はこのようなものを持っています:

<div id="sub_div">
    <span class="subl">
      <div class="node">2204830011</span>     
      <div class="node">1571827122</span>     
      <div class="node">...</span>    
      <div class="node">...</span>     
      <div class="node">...</span>      
    </span>
    <span class="subl">
      <div class="node">...</span>     
      <div class="node">...</span>     
      <div class="node">...</span>     
      <div class="node">...</span>     
      <div class="node">...</span>     
    </span>
    <span class="subl">
      <div class="node">...</span>     
      <div class="node">...</span>     
      <div class="node">...</span>     
   </span>

今、私はこれをやっています:

  def self.parse_nodes

    id       = @data.at_css("#n_info #clipnode").text unless @data.at_css("#n_info #clipnode").nil?
    name     = @data.at_css("#n_info .node_name").text unless @data.at_css("#n_info .node_name").nil?
    parent   = @data.at_css(".bc a").text unless @data.at_css(".bc a").nil?

    children_array = []
    children = @data.css('#sub_div')
    children.css('.subl').each do | child |
      child_id = child.css('.node').text[/[\d,]+/].to_i
      children_array ||= []
      children_array << child_id
    end 

    nodes_hash = "id: #{id}, name: #{name}, parent: #{parent}, children: #{children_array}"
    nodes_hash
  end

そして、私はこのようなものを得ています:

[220483001115718271223064201115857511158575013463330111571879115709231157103512258019011157197311570657115706941,

220483001115718271223064201115857511158575013463330111571879115709231157103512258019011157197311570657115706941,
 220483001115718271223064201115857511158575013463330111571879115709231157103512258019011157197311570657115706941]

.nodeコードが3 回すべて表示される理由がわかりません。とにかく、私がやりたいことは.node、各.subldiv 内のコンテンツを破棄し、それらを配列として提示することです。

[2204830011, 1571827122, 3064201115, 8575111585, 7501346333,
0111571879, 1157092311, 5710351225, 8019011157, 1973115706,
57115706941]

ライブサイト: http://www.findbrowsenodes.com/us/Apparel/1036682

4

3 に答える 3

1

以下を試してください:

children = @data.css('#sub_div')
children_array = children.css('.subl .node').map { |node| node.text.to_i }

また

children = @data.css('#sub_div')
children_array = children.css('.subl .node').map(&:text).map(&:to_i)
于 2013-09-07T04:45:16.730 に答える
1

コードは次の出力を生成します。

require 'nokogiri'

html =<<END_OF_HTML
<div id="sub_div">
    <span class="subl">
      <div class="node">2204830011</div>
      <div class="node">1571827122</div>     
      <div class="node">...</div>    
      <div class="node">...</div>     
      <div class="node">...</div>      
    </span>

    <span class="subl">
      <div class="node">...</div>     
      <div class="node">...</div>     
      <div class="node">...</div>     
      <div class="node">...</div>     
      <div class="node">...</div>     
    </span>
    <span class="subl">
      <div class="node">1</div>     
      <div class="node">...</div>     
      <div class="node">...</div>     
   </span>
</div>
END_OF_HTML

doc = Nokogiri::HTML(html)

children_array = []
children = doc.css('#sub_div')

children.css('.subl').each do | child |
  child_id = child.css('.node').text[/[\d,]+/].to_i
  children_array ||= []
  children_array << child_id
end 

p children_array

--output:--
[22048300111571827122, 0, 1]

数字を連結する理由は、次のように書くときです。

child.css('.node')

...class="node" のすべての div を含む NodeSet を取得します。text() メソッドは、NodeSet からすべてのテキスト ノードを抽出し、すべてのテキストをスペースなしで連結します。

require 'nokogiri'

html = "<div><span>hello</span><span>world</span></div>"
doc = Nokogiri::HTML(html)

spans = doc.css("span")
puts spans.text

--output:--
helloworld

だからあなたが書くとき:

child.css('.node').text

...多くの数値が連結されて 1 つの文字列になります。

できることは次のとおりです。

require 'nokogiri'

html =<<END_OF_HTML
<div id="sub_div">
    <span class="subl">
      <div class="node">2204830011</div>
      <div class="node">1571827122</div>     
      <div class="node">...</div>    
      <div class="node">...</div>     
      <div class="node">...</div>      
    </span>

    <span class="subl">
      <div class="node">...</div>     
      <div class="node">...</div>     
      <div class="node">...</div>     
      <div class="node">...</div>     
      <div class="node">...</div>     
    </span>
    <span class="subl">
      <div class="node">3333333</div>     
      <div class="node">...</div>     
      <div class="node">...</div>     
   </span>
</div>
END_OF_HTML


doc = Nokogiri::HTML(html)
results = []

doc.css("#sub_div span.subl div.node").each do |div|
  if num = div.text[/[\d,]+/] 
    results << num.to_i
  end
end

p results

--output:--
[2204830011, 1571827122, 3333333]
于 2013-09-07T06:48:26.677 に答える
0

ここに別のアプローチがあります:-

require 'nokogiri'

doc = Nokogiri::HTML::Document.parse <<-eotl
<div id="sub_div">
    <span class="subl">
      <div class="node">2204830011</div>
      <div class="node">1571827122</div>     
      <div class="node">...</div>    
      <div class="node">...</div>     
      <div class="node">...</div>      
    </span>

    <span class="subl">
      <div class="node">...</div>     
      <div class="node">...</div>     
      <div class="node">...</div>     
      <div class="node">...</div>     
      <div class="node">...</div>     
    </span>
    <span class="subl">
      <div class="node">3333333</div>     
      <div class="node">...</div>     
      <div class="node">...</div>     
   </span>
</div>
   eotl

doc.xpath("//div[@id='sub_div']//div[@class='node'][boolean(number()) or . = 0]").map{|n| n.text.to_i}
# => [2204830011, 1571827122, 3333333]
于 2013-09-07T07:56:39.363 に答える