2012-07-25 256 views
0

我有很長的循環EOF與引入nokogiri

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

以下行有時我的Ruby應用程序崩潰提高「到達文件結尾」異常這一行。

我該如何解決這個問題?只是開始,提高,結束塊?

是執行論壇備份的腳本,所以重要的是不跳過任何線程。

在此先感謝。

回答

0

我建議你應該先解決潛在的問題,以免你得到這個錯誤。

  • 相同的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

1

除了@ 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