Скрабыт выдает ошибку 404 при нажатии на ссылку методом _details - PullRequest
1 голос
/ 04 октября 2008

Это может быть проблема, аналогичная моим двум предыдущим вопросам - см. здесь и здесь , но я пытаюсь использовать команду _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.

Обновление: Я думаю, что ссылка может быть относительной, может ли это вызывать проблемы? Есть идеи, как с этим бороться?

Ответы [ 4 ]

1 голос
/ 15 октября 2009

У меня была такая же проблема с относительными ссылками, и я исправил ее следующим образом ... вы должны установить параметр: resolv в правильную базовую ссылку

  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
1 голос
/ 05 октября 2008
    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 и почему.

Так я и нашел ответ на ваши предыдущие вопросы.

Удачи.

0 голосов
/ 06 октября 2008

Я пытался получить доступ к doc_url, но, похоже, также возвращает ноль. Когда у меня будет доступ к моему серверу (позже в тот же день), я выложу код с битом отладки.

0 голосов
/ 06 октября 2008

Извините, я понятия не имею, почему это будет ноль - каждый раз, когда я запускаю это, он возвращает URL - метод self.fetch требует URL, к которому вы должны иметь доступ в качестве локальной переменной doc_url. Если при этом возвращается ноль, возможно, вам следует опубликовать код, в который вы включили вызов отладчика.

...