网络刮痧与Nokogiri和机械化

时间:2015-01-27 14:55:07

标签: ruby nokogiri mechanize

我正在解析prada.com并希望在div类“nextItem”中抓取数据并获取其名称和价格。这是我的代码:

require 'rubygems'
require 'mechanize'
require 'nokogiri'
require 'open-uri'
agent = Mechanize.new
page = agent.get('http://www.prada.com/en/US/e-store/department/woman/handbags.html?cmp=from_home')
fp = File.new('prada_prices','w')
html_doc = Nokogiri::HTML(page)
page = html_doc.xpath("//ol[@class='nextItem']")
page.each do {|i| fp.write(i.text + "\n")}
end

我收到错误但没有输出。我认为我正在做的是实例化一个mechanize对象并将其称为代理。 然后创建一个页面变量并为其分配提供的URL。 然后创建一个变量,它是一个nokogiri对象,传递了机械化URL 然后在url中搜索名为nextItem的所有类引用 然后打印那里包含的所有数据

有人能告诉我可能出错的地方吗?

2 个答案:

答案 0 :(得分:2)

由于Prada的网站通过JavaScript动态加载其内容,因此很难删除其内容。见" Scraping dynamic content in a website"了解更多信息。

一般来说,在获得页面后使用Mechanize:

page = agent.get(page_url)

您可以使用CSS选择器轻松搜索项目并搜索数据:

next_items = page.search(".fooClass")

next_items.each do |item|
  price = item.search(".fooPrice").text
end

然后只需处理字符串或根据需要生成哈希值。

答案 1 :(得分:0)

以下是错误的部分:

  • 再次检查阻止语法 - 使用{}do / end但不能同时使用两者。
  • Mechanize#get会返回Mechanize::Page作为Nokogiri文档,至少有searchxpathcss。使用它们而不是试图将文档强制转换为Nokogiri :: HTML对象。
  • 当您不直接使用它们时,无需require 'open-uri'require 'nokogiri'
  • 在继续进行网页抓取之前,最后可以查看Ruby的基础知识。

以下是修复代码:

require 'rubygems'
require 'mechanize'
agent = Mechanize.new
page = agent.get('http://www.prada.com/en/US/e-store/department/woman/handbags.html?cmp=from_home')
fp = File.new('prada_prices','w')
page = page.search("//ol[@class='nextItem']").each do |i| 
  fp.write(i.text + "\n")
end
fp.close