*编辑: 根据我在下面的评论,我想一个更好的问题是,'机械化通过每个网址并更新其名称列的正确方法是什么? (每个名称对于网址都是唯一的)'以下是我一直在进行的练习。 *
我有一张像...一样的postgres表 | name(string)|网址(文字)|
url列已经填充了各种url,看起来像这样: http://www.a4apps.com/Websites/SampleCalendar/tabid/89/ctl/Register/Default.aspx
我正在尝试运行一个机械化rake任务,该任务将遍历每个url,并根据它在css标记中找到的文本更新名称。
namespace :db do
desc "Fetch css from db urls"
task :fetch_css => :environment do
require 'rubygems'
require 'mechanize'
require 'open-uri'
agent = Mechanize.new
url = Mytable.pluck(:url)
agent.get(url)
agent.page.search('#dnn_ctr444_ContentPane').each do |item|
name = item.css('.EventNextPrev:nth-child(1) a').text
Mytable.update(:name => name)
end
end
end
当我运行rake任务时,它返回:
rake aborted!
bad URI(is not URI?): %255B%2522http://www.a4apps.com/Websites/SampleCalendar/tabid/89/Default.aspx%2522,%2520%2522http://www.a4apps.com/Websites/SampleCalendar/tabid/89/ctl/Privacy/Default.aspx%2522,%2520%2522http://www.a4apps.com/Websites/SampleCalendar/tabid/89/ctl/Terms/Default.aspx%2522,%2520%2522http://www.a4apps.com/Websites/SampleCalendar/tabid/89/ctl/Register/Default.aspx%2522%255D
感谢您的帮助。如果我有任何方法可以让问题更容易回答,请告诉我。 麦克
答案 0 :(得分:1)
我最近在回答自己的问题时感到有些孤独,但如果其他人发现自己处于相同的约束状态,我会发布我的答案。此外,也许其他人会告诉我,如果我的解决方案有任何致命的缺陷,我还没有看到。这是我的最终rake似乎正在工作,从我的表中获取URL,在它们上运行机械化并使用在URL上找到的信息更新表...
namespace :db do
desc "Fetch css from db urls"
task :fetch_css => :environment do
Mytable.all.each do |info| # for each row do...
require 'rubygems'
require 'mechanize'
require 'open-uri'
agent = Mechanize.new
agent.get(info.url) # get the url column data for the current db row...
nombre = agent.page.search('.EventNextPrev:nth-child(1) a').text # plug it into mech.
info.update_attributes(:name => nombre) # and update the db with the css result.
end
end
end
感谢。 麦克