2011-04-08 58 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

相关问题