2012-09-03 46 views
4

我正在嘗試使用Nokogiri的HTML抓取,但沒有得到預期的結果。使用Nokogiri的CSS選擇

在這個特定的URL上,我正在查看特定位置的交易,並希望在該頁面上顯示交易詳情。 .small-deals-cont是頁面的CSS選擇器,同樣.deal-title是交易標題的CSS選擇器。

require 'rubygems' 
require 'nokogiri' 
require 'open-uri' 

url = "http://www.snapdeal.com/local-deals-Chennai-all?category=all&HID=dealHeader_all" 

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

puts doc.at_css("title").text 

doc.css(".small-deals-cont").each do |item| 
    puts item.at_css(".deal-title") 
end 

回答

2

爲了防止抓取,他們可能會在初始頁面加載後(使用javascript)加載內容。在這種情況下Nokogiri不會幫助你,你需要一個更精細的系統 - 可能使用mechanize

但是,最後,你不應該刮。本網站的所有者已經採取了防止它的方法,您應該尊重這一點。檢查一個API。

+1

+1使用API​​推薦。 Mechanize對JavaScript沒有幫助,因爲它不是JavaScript解釋器。如果需要刮Wa,Watir或其衍生產品之一會更好。 –

4

引入nokogiri實際工作,這和我們不需要使用機械化的this.Here是它的代碼:

require 'rubygems' 
require 'nokogiri' 
require 'open-uri' 
require 'csv' 

hotel= Array.new 

cuisine=Array.new 

url= "http://www.abcd.com" 

1.upto(5) do |page_num| 
    doc = Nokogiri::HTML(open("http://www.abcd.com/cit/restaurants?page=#{page_num}")) 
    puts doc.at_css("title").text 

    doc.css("article").each do |item| 
    hotel << item.at_css("a").text 
    cuisine << item.at_css(".tags").text 
    end 
end 

@hotel=hotel 
@cuisine=cuisine 

([email protected] - 1).each do|index| 

    puts "Hotel: #{@hotel[index]}" 
    puts "Cuisine: #{@cuisine[index]}" 
    puts " " 

end 


CSV.open("output2.csv", "wb") do |row| 

    row << ["Hotel", "Cuisine"] 

    ([email protected] - 1).each do |index| 
    row << [@hotel[index], @cuisine[index]] 
    end 

end