试图弄清楚我在应用程序/ 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 %>
我是否需要其他方法,而不是正确存储数组?
答案 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
会返回它输出的值,但是依赖于p
中map
的返回值是不好的形式。相反,您应该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 }