这可能与我之前的两个问题类似 - 请参阅here和here,但我正在尝试使用_detail命令自动点击链接,以便我可以抓取详细信息页面每个单独的活动。
我正在使用的代码是:
require 'rubygems'
require 'scrubyt'
nuffield_data = Scrubyt::Extractor.define do
fetch 'http://www.nuffieldtheatre.co.uk/cn/events/event_listings.php'
event do
title 'The Coast of Mayo'
link_url
event_detail do
dates "1-4 October"
times "7:30pm"
end
end
next_page "Next Page", :limit => 20
end
nuffield_data.to_xml.write($stdout,1)
有没有办法打印出使用event_detail尝试访问的URL?该错误似乎没有给我提供404的URL。
更新:我认为该链接可能是一个相对链接 - 这可能导致问题吗?任何想法如何处理?
答案 0 :(得分:1)
sudo gem install ruby-debug
This will give you access to a nice ruby debugger, start the debugger by altering your script:
require 'rubygems'
require 'ruby-debug'
Debugger.start
Debugger.settings[:autoeval] = true if Debugger.respond_to?(:settings)
require 'scrubyt'
nuffield_data = Scrubyt::Extractor.define do
fetch 'http://www.nuffieldtheatre.co.uk/cn/events/event_listings.php'
event do
title 'The Coast of Mayo'
link_url
event_detail do
dates "1-4 October"
times "7:30pm"
end
end
next_page "Next Page", :limit => 2
end
nuffield_data.to_xml.write($stdout,1)
Then find out where scrubyt is throwing an exception - in this case:
/Library/Ruby/Gems/1.8/gems/scrubyt-0.3.4/lib/scrubyt/core/navigation/fetch_action.rb:52:in `fetch'
Find the scrubyt gem on your system, and add a rescue clause to the method in question so that the end of the method looks like this:
if @@current_doc_protocol == 'file'
@@hpricot_doc = Hpricot(PreFilterDocument.br_to_newline(open(@@current_doc_url).read))
else
@@hpricot_doc = Hpricot(PreFilterDocument.br_to_newline(@@mechanize_doc.body))
store_host_name(self.get_current_doc_url) # in case we're on a new host
end
rescue
debugger
self # the self is here because debugger doesn't like being at the end of a method
end
现在再次运行脚本,在引发异常时应将其放入调试器中。只需尝试在调试提示符下输入此内容即可查看违规URL:
@@current_doc_url
如果要检查正在发生的事情,也可以在该方法的任何位置添加调试器语句 - 例如,您可能希望在此方法的第51行和第52行之间添加一个,以检查所调用的URL如何更改为什么。
这基本上是我如何找到你以前问题的答案。
祝你好运。答案 1 :(得分:1)
我遇到了相关链接相同的问题并修复了这个...你必须将:resolve param设置为正确的基本URL
event do
title 'The Coast of Mayo'
link_url
event_detail :resolve => 'http://www.nuffieldtheatre.co.uk/cn/events' do
dates "1-4 October"
times "7:30pm"
end
end
答案 2 :(得分:0)
很抱歉我不知道为什么会这样 - 每次我运行它都返回一个url - 方法self.fetch需要一个你应该能够作为局部变量doc_url访问的URL。如果返回nil,也可以将代码发布到包含调试器调用的位置。
答案 3 :(得分:0)
我试图访问doc_url,但似乎也返回nil。当我可以访问我的服务器(当天晚些时候)时,我将发布带有调试位的代码。