EOF与引入nokogiri

问题描述:

我有很长的循环EOF与引入nokogiri

page = Nokogiri::HTML(open(topic[:url].first)).xpath('//ul[@class = "pages"]//li').first 

以下行有时我的Ruby应用程序崩溃提高“到达文件结尾”异常这一行。

我该如何解决这个问题?只是开始,提高,结束块?

是执行论坛备份的脚本,所以重要的是不跳过任何线程。

在此先感谢。

我建议你应该先解决潜在的问题,以免你得到这个错误。

  • 相同的URL是否始终导致问题? (将它输出到您的日志文件中。)如果是这样,也许您需要URI encode the URL
  • 它是随机的,因此可能与连接打嗝或服务器问题有关?如果是这样,你应该抢救出具体的错误,然后再进行一次或多次获取关键数据。

其次,你应该知道,该查询的CSS语法简单得多:

page = Nokogiri.HTML(...).at_css('ul.pages li') 
  • 这不仅是不到一半的字节,它允许情况下,像<ul class="foo pages">与XPath会错过。
  • 使用at_css(或at_xpath)与.css(...).first相同,但更快更简单。
+0

当然可以是服务器的限制(该应用程序与调用#458崩溃),但我不能确定这是事实... – 2012-07-25 23:08:36

除了@ Phrogz的优良建议(特别是约at_css与简单的表达式),我会拉原始XML [内容]分别:

page = if (content = open(topic[:url].first)).strip.length > 0 
    Nokogiri::HTML(content).xpath('//ul[@class = "pages"]//li').first 
end 
+0

我认为你需要一个'.read',不是吗? – Phrogz 2012-07-25 21:19:33

+0

感谢您的回复,但我确实 'next除非topic [:url] .first.page_exists? '// ul [@class =“pages”] // li'' first to do 'page = Nokogiri :: HTML(open(topic [:url] .first))。xpath('// ul [ class =“pages”] // li')。 #page_exists是String的一种方法: 'begin !Nokogiri :: HTML(open(self))。to_s.empty? rescue例外=> e false end' – 2012-07-25 23:00:49