1

这可能与我之前的两个问题类似 - 请参阅此处此处,但我正在尝试使用 _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。

更新:我认为该链接可能是一个相对链接——这会导致问题吗?任何想法如何处理?

4

4 回答 4

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 如何更改以及为什么。

这基本上就是我如何找出你之前问题的答案。

祝你好运。

于 2008-10-04T22:56:48.580 回答
1

我对相对链接有同样的问题并像这样修复它......你必须将 :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
于 2009-10-15T13:02:06.897 回答
0

抱歉,我不知道为什么它会为零 - 每次我运行它都会返回一个 url - self.fetch 方法需要一个 URL,您应该能够作为局部变量 doc_url 访问该 URL。如果这返回 nil 也可能您应该发布包含调试器调用的代码。

于 2008-10-05T20:19:40.813 回答
0

我试图访问 doc_url 但这似乎也返回 nil。当我可以访问我的服务器时(当天晚些时候),我将发布带有调试位的代码。

于 2008-10-06T08:07:44.863 回答