2011-04-08 57 views
0

我想從使用nokogiri的亞馬遜html頁面獲取ASIN號碼,但我沒有使用xpath的運氣。我已經嘗試過與firepath,我仍然沒有得到任何東西。只需獲取URL然後運行ruby REGEX來獲取ASIN會更好嗎?如果是這樣的正則表達式是什麼樣子?如何使用nokogiri從列表中獲取'asin'標籤?

#!/usr/bin/env ruby -w 
require 'nokogiri' 
require 'open-uri' 
url = "http://www.amazon.com/gp/new-releases/books/3839/ref=zg_bsnr_nav" 
doc = Nokogiri::HTML(open(url)) 

puts doc.xpath('//zg_list').each do | node| 
    p node['asin'] 
end 

這就是我打印出url時的情況。

#!/usr/bin/env ruby -w 
require 'nokogiri' 
require 'open-uri' 
url = "http://www.amazon.com/gp/new-releases/books/3839/ref=zg_bsnr_nav" 
doc = Nokogiri::HTML(open(url)) 

l = doc.css('div.zg_image a').map { |link| 
    link['href'] 
    } 
puts l # => /Introducing-ZBrush-4-Eric-Keller/dp/0470527641/ref=zg_bsnr_3839_20/183-0702383-0095048 

回答

1

對我來說,在引入nokogiri的css方法更容易比XPath的工作。由於HTML在您發佈的URL下面應該找回「ASIN」屬性爲每個項目:

doc.css("div.zg_item").map { |e| e["asin"] } 

我認爲正確的XPath會是這樣的:

doc.xpath("//div[contains(@class, 'zg_item') and @asin]") 
1

您可以使用CSS訪問器或XPath:

#!/usr/bin/env ruby -w 

require 'nokogiri' 
require 'open-uri' 

url = "http://www.amazon.com/gp/new-releases/books/3839/ref=zg_bsnr_nav" 

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

# CSS 
# puts doc.search('div[class="zg_item zg_sparseListItem"]').each { |n| p n['asin'] } 

# XPath 
puts doc.search('//div[@class="zg_item zg_sparseListItem"]').each { |n| p n['asin'] } 

# >> "1934356549" 
# >> "0596802471" 
# >> "B004M8T01Q" 
# >> "0596809158" 
# >> "0470943327" 
# >> "B004MMEJ36" 
# >> "1935182641" 
# >> "B004RDOPJI" 
# >> "1449390501" 
# >> "1449389716" 
# >> "B004IWRH4I" 
# >> "0470527641" 
# >> "0735650926" 
# >> "1430231475" 
# >> "0321751043" 
# >> "B004NBZ65G" 
# >> "B004TMNSJK" 
# >> "0132091518" 
# >> "144030842X" 
# >> "1430234040" 
# >> 0 
+0

感謝您的xpath版本,我仍然試圖在搜索過程中使用xpath。 – Kevin 2011-04-08 15:21:10

+0

XPath功能強大,但有時CSS訪問器是更直接的路徑。最好的辦法是看看哪一條路徑對特定搜索的阻力最小,然後跟隨它,因爲從長遠來看,隨着代碼轉移到維護模式,能夠快速掌握正在搜索的節點變得比這是更酷/更男子氣概的東西寫入。 – 2011-04-08 16:13:20

+0

請注意,您可以通過使用XPath來直接選擇所有'asin'屬性值:'puts doc.xpath('// div [@asin]/@asin')' – Phrogz 2011-04-08 17:10:12

相關問題