Как получить тег 'asin' из списков, используя nokogiri? - PullRequest
0 голосов
/ 08 апреля 2011

Я пытаюсь получить номер ASIN на html-странице amazon с помощью nokogiri, но мне не повезло с использованием xpath. Я попробовал это с firepath, и я все еще ничего не получаю. Было бы лучше просто получить URL-адрес, а затем запустить рубиновый REGEX, чтобы получить 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

Ответы [ 2 ]

1 голос
/ 08 апреля 2011

Вы можете использовать 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
1 голос
/ 08 апреля 2011

Для меня метод css в Nokogiri гораздо проще работать, чем XPath. Учитывая HTML-код по URL-адресу, который вы разместили, следующее должно извлечь свойство «asin» для каждого элемента:

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

Я думаю, что правильный XPath будет выглядеть примерно так:

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