0

私は現在、製品のタイトル、説明、および価格を取得するコードを持っていますが、それはうまく機能します。ただし、ジレンマがある画像の 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セレクターに簡単に配置できませんでした。私はルビー/ノコギリに本当に慣れていないので、何か助けていただければ幸いです。

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
4

2 に答える 2

2

変更してみてください:

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

に:

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

「.」のポイント 現在のノードの子であるすべてのイメージが必要であると言う必要があります (たとえば、製品 2 のイメージをのぞき見しないようにするため)。

于 2013-02-27T19:35:06.687 に答える
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) }
于 2013-02-27T19:27:38.833 に答える