我目前有一段代码,它将抓取产品标题,描述和价格,并且它工作得很好。但是,我还需要它来获取图像URL,这是我的困境所在。我尝试在循环内使用xpath,我有在底部,它列出了所有的图像等于220上的每一个产品,我不想要的。所以我得到了这样的东西....
product 1标题在这里
product 1此处描述
产品1的价格在这里
http://www.test.com/product1.jpg
http://www.test.com/product2.jpg
http://www.test.com/product3.jpg
http://www.test.com/product4.jpg
product 2标题在这里
产品2说明在这里
产品2的价格在这里
http://www.test.com/product1.jpg
http://www.test.com/product2.jpg
http://www.test.com/product3.jpg
http://www.test.com/product4.jpg
我显然希望产品1有http://www.test.com/product1.jpg产品2有http://www.test.com/product2.jpg等等。图像只是在没有类或ID的div标签中,因此我没有简单地将它们放入css选择器中。我对ruby/nokogiri真的很陌生,所以任何帮助都会很棒。
require 'nokogiri'
require 'open-uri'
url = "http://thewebsitehere"
data = Nokogiri::HTML(open(url))
products = data.css('.item')
products.each do |product|
puts product.at_css('.vproduct_list_title').text.strip
puts product.at_css('.vproduct_list_descr').text.strip
puts product.at_css('.price-value').text.strip
puts product.xpath('//img[@width = 220]/@src').map {|a| a.value }
end
尝试更改:
puts product.xpath('//img[@width = 220]/@src').map {|a| a.value }
:
puts product.xpath('.//img[@width = 220]/@src').map {|a| a.value }
的点'。也就是说,你想要的所有图像都是当前节点的子节点(例如,这样你就不会偷看产品2的图像)。
File#basename
将只返回文件名:
File.basename('http://www.test.com/product4.jpg')
#=> "product4.jpg"
你可能想要这样写:
puts product.xpath('//img[@width = 220]/@src').map {|a| File.basename(a.value) }