【问题标题】:Transitioning from Scrubyt to Nokogiri- Write to XML or Hash?从 Scrubyt 过渡到 Nokogiri - 写入 XML 或 Hash?
【发布时间】:2009-08-19 06:22:32
【问题描述】:

我正在尝试将这段代码从scrubyt 转换为nokogiri,并且一直试图将我的结果写入哈希或xml。在 scryt 中,它看起来如下所示:

require 'rubygems'
  require 'scrubyt'

  result_data = Scrubyt::Extractor.define do
    fetch "http://www.amazon.com/gp/offer-listing/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

使用 nokogiri 我可以解析出我想要的信息,但似乎没有一种快速的方法来返回散列或 xml 文档中的项目。这就是我在 nokogiri 所拥有的一切。

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 或哈希?

【问题讨论】:

    标签: ruby-on-rails xml rubygems nokogiri scrubyt


    【解决方案1】:

    您可以使用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
    

    【讨论】:

      【解决方案2】:

      想通了……

      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>
      

      【讨论】:

        【解决方案3】:

        谢谢!这正是我需要的。不过,我无法正确循环。

        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=>
            <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>
        

        我将如何重写我的代码以返回如下内容:

        <?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>
        

        【讨论】:

          【解决方案4】:

          你可能想省略“=” xml.price = p.content

          【讨论】:

            猜你喜欢
            • 2018-01-15
            • 2014-01-31
            • 1970-01-01
            • 1970-01-01
            • 2018-05-22
            • 1970-01-01
            • 2012-02-15
            • 2015-05-07
            • 1970-01-01
            相关资源
            最近更新 更多