我正在解析 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
,至少它有search
、xpath
、css
。使用它们,而不是尝试将文档强制到 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