通过nokogiri和xpath解析图像

时间:2013-02-27 19:21:07

标签: css ruby xpath nokogiri

我目前有一段代码可以获取产品名称,描述和价格,因此效果很好。但是,我还需要它来获取图像URL,这是我的困境所在。我试着在我底部的循环中使用一个xpath,它列出了所有我不想要的产品上等于220的图像。所以基本上我得到这样的东西......

产品1标题在这里
产品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


产品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

2 个答案:

答案 0 :(得分:2)

尝试更改:

puts product.xpath('//img[@width = 220]/@src').map {|a| a.value }

为:

puts product.xpath('.//img[@width = 220]/@src').map {|a| a.value }

'。'的要点可以说你想要所有当前节点的孩子的图像(例如,你不是在偷看产品2的图像)。

答案 1 :(得分:0)

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) }