使用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

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

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

由于Prada的网站通过JavaScript动态加载其内容,因此很难抓取其内容。有关详细信息,请参阅"抓取网站中的动态内容"。

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

page = agent.get(page_url)

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

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

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

以下是错误的部分:

  • 再次检查块语法 - 使用 {}do/end 但不能同时使用两者。
  • Mechanize#get返回一个充当 Nokogiri 文档的Mechanize::Page,至少它有 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

相关内容

  • 没有找到相关文章

最新更新