4

我正在尝试使用 Nokogiri 进行 HTML 抓取,但没有得到预期的结果。

在这个特定的 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
4

2 回答 2

4

Nokogiri 实际上适用于此,我们不需要为此使用机械化。这是它的代码:

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

(0..@hotel.length - 1).each do|index|

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

end


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

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

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

end
于 2012-09-07T11:22:28.040 回答
2

为了防止抓取,他们可能会在初始页面加载(使用 javascript)之后加载内容。在这种情况下,Nokogiri 将无济于事,您需要一个更精致的系统 - 也许使用mechanize

但是,最后,您不应该刮擦。本网站的所有者已经制定了防止它的方法,您应该尊重这一点。检查 API。

于 2012-09-03T14:48:12.080 回答