Это может быть проблема, аналогичная моим предыдущим двум вопросам - см. здесь и здесь, но я пытаюсь использовать команду _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)
Есть ли способ распечатать URL-адрес, к которому с помощью event_detail пытается получить доступ? Ошибка, похоже, не дает мне URL-адрес, который дал 404.
Обновлять: Я думаю, что ссылка может быть относительной - может ли это вызывать проблемы? Есть идеи, как с этим бороться?

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-адрес и почему.
В основном так я нашел ответ на ваши предыдущие вопросы.
Удачи.
Извините, я понятия не имею, почему это будет ноль - каждый раз, когда я запускаю его, он возвращает URL-адрес - метод self.fetch требует URL-адреса, к которому вы должны иметь доступ как локальную переменную doc_url. Если это возвращает nil, вы также можете опубликовать код, в который вы включили вызов отладчика.
Я пытался получить доступ к doc_url, но, похоже, он также возвращает nil. Когда у меня будет доступ к моему серверу (позже в тот же день), я отправлю код с битом отладки в нем.
У меня была такая же проблема с относительными ссылками, и я исправил ее вот так ... вы должны установить параметр: resolve на правильный базовый 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