我正在解析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的所有类引用 然后打印那里包含的所有数据
有人能告诉我可能出错的地方吗?
答案 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文档,至少有search
,xpath
,css
。使用它们而不是试图将文档强制转换为Nokogiri :: HTML对象。require 'open-uri'
和require 'nokogiri'
。以下是修复代码:
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