Nokogiri在视图中显示数据

时间:2017-04-03 17:44:43

标签: ruby-on-rails ruby nokogiri

试图弄清楚我在应用程序/ html中显示的文本和图像的显示方式。 这是我的app / scrape2.rb文件

require 'nokogiri'
require 'open-uri'

url = "https://marketplace.asos.com/boutiques/independent-label"

doc = Nokogiri::HTML(open(url))

label = doc.css('#boutiqueList')

@label = label.css('#boutiqueList img').map { |l| p l.attr('src') }
@title = label.css("#boutiqueList .notranslate").map { |o| p o.text }

这是控制器:

class PagesController < ApplicationController
    def about
        #used to change the routing to /about
    end

      def index
         @label = label.css('#boutiqueList img').map { |l| p l.attr('src') }
         @title = label.css("#boutiqueList .notranslate").map { |o| p o.text }
    end

end

最后是label.html.erb页面:

<% @label.each do |image| %>
<%= image_tag image %>
<% end %>

我是否需要其他方法,而不是正确存储数组?

2 个答案:

答案 0 :(得分:2)

您的控制器需要自己加载数据,或以某种方式从scrape2.rb提取数据。除非指定(包括,扩展等),否则控制器无权访问其他文件。

require 'nokogiri'
require 'open-uri'

class PagesController < ApplicationController

  def index 

     # Call these in your controller:
     url = "https://marketplace.asos.com/boutiques/independent-label"
     doc = Nokogiri::HTML(open(url))
     label = doc.css('#boutiqueList')

     @label = label.css('#boutiqueList img').map { |l| p l.attr('src') }
     @title = label.css("#boutiqueList .notranslate").map { |o| p o.text }
  end
end

答案 1 :(得分:0)

您没有正确解析数据。

label = doc.css('#boutiqueList')

应该是:

label = doc.at('#boutiqueList')

#boutiqueList是一个ID,其中一次只能存在一个ID。 css返回一个NodeSet,它就像一个数组,但你真的想指向Node本身,这就是at会做的事情。 at相当于search('...').first

然后你使用:

label.css('#boutiqueList img')

这也是错误的。 label应该已经指向包含#boutiqueList的节点,但是您希望Nokogiri查看该节点并查找包含id="boutiqueList"且包含<img>标记的其他节点。但是,再次,因为#boutiqueList是一个ID,并且它不能在文档中出现多次,Nokogiri无法找到任何节点:

label.css('#boutiqueList img').size # => 0

而使用label.css正确找到<img>个节点:

label.css('img').size # => 48

然后使用map打印出值,但map用于修改数组迭代时的内容。 p会返回它输出的值,但是依赖于pmap的返回值是不好的形式。相反,您应该map转换值,然后puts结果,如果您需要查看它:

 @label = label.css('#boutiqueList img').map { |l| l.attr('src') }
 puts @label

我没有使用attr('src'),而是将第一行写为:

 @label = label.css('img').map { |l| l['src'] }

同样如此:

@title = label.css("#boutiqueList .notranslate").map { |o| p o.text }