2009-08-19 7 views
1

私はこのコードをscrubytからnokogiriに移行しようとしています。結果をハッシュまたはXMLに書き込もうとしています。鋸山でScrubytからNokogiriへの移行 - XMLまたはハッシュへの書き込み?

require 'rubygems' 
    require 'scrubyt' 

    result_data = Scrubyt::Extractor.define do 
    fetch "http://rads.stackoverflow.com/amzn/click/0061673730" 
    results "//div[@class='resultsset']" do 
     item "//tbody/tr" do 
      condition "//div[@class = 'Condition']" 
      price "//span[@class = 'price']" 
      shipping "//span[@class = 'price_shipping']" 
     end 
    end 
    end 
    @description = result_data.to_xml 
    return @description 
end 

私は私が欲しい情報を解析することができますが、ハッシュまたはXML文書内の項目を返すための簡単な方法があるようには思えない。scrubytでは、次のようになります。ここにノコギリのすべてがあります。

require 'rubygems' 
require 'nokogiri' 
require 'open-uri' 
doc = Nokogiri::HTML(open('http://www.amazon.com/gp/offer-listing/0061673730')) 

doc.css('div.condition, span.price, span.price_shipping ').each do |item| 
puts item.content 
end 

xmlまたはハッシュのどちらにアイテム情報を返すのですか?

答えて

4

Builderを使用してXMLを構築できます。

builder = Nokogiri::XML::Builder.new do |xml| 
    xml.root { 
    xml.items { 
     doc.css('div.condition, span.price, span.price_shipping').each do |o| 
     xml.item_content = o 
     end 
    } 
    } 
end 

puts builder.to_xml 
0

ありがとうございます!それがまさに私が必要なものです。私は問題が正しくループしている。

<?xml version="1.0"?> 
<root> 
    <item> 
    <price=>&lt;span class="price"&gt;$6.09&lt;/span&gt;</price=> 
    <price=>&lt;span class="price"&gt;$6.48&lt;/span&gt;</price=> 
    <price=>&lt;span class="price"&gt;$11.95&lt;/span&gt;</price=> 
    <ship=>&lt;span class="price_shipping"&gt;+ $3.99&lt;/span&gt;</ship=> 
    <ship=>&lt;span class="price_shipping"&gt;+ $3.99&lt;/span&gt;</ship=> 
    <ship=>&lt;span class="price_shipping"&gt;+ $3.99&lt;/span&gt;</ship=> 

    </item> 
</root> 

どのように私はこのような何かを返すために私のコードを書き換えるでしょう:これは返す

require 'rubygems' 
require 'nokogiri' 
require 'open-uri' 
doc = Nokogiri::HTML(open('http://www.amazon.com/gp/offer-listing/0061673730')) 
builder = Nokogiri::XML::Builder.new do |xml| 
    xml.root { 
    xml.item { 
     doc.css('span.price').each do |o| 
     xml.price = o 
     doc.css('span.price_shipping').each do |o| 

     end 
     end 
    } 
    } 
end 

puts builder.to_xml 

<?xml version="1.0"?> 
<root> 
    <item> 
    <price=>&lt;span class="price"&gt;$6.09&lt;/span&gt;</price=> 
    <ship=>&lt;span class="price_shipping"&gt;+ $3.99&lt;/span&gt;</ship=> 
    </item> 
    <item> 
    <price=>&lt;span class="price"&gt;$6.48&lt;/span&gt;</price=> 
    <ship=>&lt;span class="price_shipping"&gt;+ $3.99&lt;/span&gt;</ship=> 
    </item> 
    <item> 
    <price=>&lt;span class="price"&gt;$11.95&lt;/span&gt;</price=> 
    <ship=>&lt;span class="price_shipping"&gt;+ $3.99&lt;/span&gt;</ship=> 
    </item> 
</root> 
1

はそれを考え出したが...

require 'rubygems' 
require 'nokogiri' 
require 'open-uri' 

doc = Nokogiri::HTML(open('http://www.amazon.com/gp/offer-listing/0061673730')) 
builder = Nokogiri::XML::Builder.new do |xml| 
xml.root { 
doc.xpath('//tbody[@class="result"]').each do |res| 
    xml.result { 
    res.css('span.price').each do |p| 
     xml.price = p.content 
    end 
    res.css('span.price_shipping').each do |s| 
     xml.ship = s.content 
    end 
    } 
    end 
} 
end 
puts builder.to_xml 

結果:

<?xml version="1.0"?> 
<root> 
    <result> 
    <price=>$6.09</price=> 
    <ship=>+ $3.99</ship=> 
    </result> 
    <result> 
    <price=>$6.48</price=> 
    <ship=>+ $3.99</ship=> 
    </result> 
    <result> 
    <price=>$7.12</price=> 
    <ship=>+ $3.99</ship=> 
    </result> 
    <result> 
    <price=>$7.31</price=> 
    <ship=>+ $3.99</ship=> 
    </result> 
    <result> 
    <price=>$7.52</price=> 
    <ship=>+ $3.99</ship=> 
    </result> 
    <result> 
    <price=>$7.52</price=> 
    <ship=>+ $3.99</ship=> 
    </result> 
    <result> 
    <price=>$11.53</price=> 
    </result> 
    <result> 
    <price=>$7.56</price=> 
    <ship=>+ $3.99</ship=> 
    </result> 
    <result> 
    <price=>$7.61</price=> 
    <ship=>+ $3.99</ship=> 
    </result> 
    <result> 
    <price=>$7.61</price=> 
    <ship=>+ $3.99</ship=> 
    </result> 
    <result> 
    <price=>$7.95</price=> 
    <ship=>+ $3.99</ship=> 
    </result> 
    <result> 
    <price=>$7.95</price=> 
    <ship=>+ $3.99</ship=> 
    </result> 
    <result> 
    <price=>$8.59</price=> 
    <ship=>+ $3.99</ship=> 
    </result> 
    <result> 
    <price=>$8.99</price=> 
    <ship=>+ $3.99</ship=> 
    </result> 
    <result> 
    <price=>$10.05</price=> 
    <ship=>+ $3.99</ship=> 
    </result> 
    <result> 
    <price=>$10.32</price=> 
    <ship=>+ $3.99</ship=> 
    </result> 
    <result> 
    <price=>$10.32</price=> 
    <ship=>+ $3.99</ship=> 
    </result> 
    <result> 
    <price=>$10.55</price=> 
    <ship=>+ $3.99</ship=> 
    </result> 
    <result> 
    <price=>$10.56</price=> 
    <ship=>+ $3.99</ship=> 
    </result> 
    <result> 
    <price=>$11.42</price=> 
    <ship=>+ $3.99</ship=> 
    </result> 
    <result> 
    <price=>$11.59</price=> 
    <ship=>+ $3.99</ship=> 
    </result> 
    <result> 
    <price=>$11.90</price=> 
    <ship=>+ $3.99</ship=> 
    </result> 
    <result> 
    <price=>$11.95</price=> 
    <ship=>+ $3.99</ship=> 
    </result> 
    <result> 
    <price=>$12.07</price=> 
    <ship=>+ $3.99</ship=> 
    </result> 
    <result> 
    <price=>$12.35</price=> 
    <ship=>+ $3.99</ship=> 
    </result> 
</root> 
0

あなたはp.content

= xml.priceに "=" を省略することもできます
関連する問題