2012-12-13 101 views
0

我需要多次讀取網頁的內容,並從中提取一些信息,我使用正則表達式。我使用open-uri閱讀網頁內容,我編寫的代碼示例如下:閱讀紅寶石中的幾個URI

require 'open-uri' 

def getResults(words) 
    results = [] 
    words.each do |word| 
     results.push getAResult(word) 
    end 
    results 
end 

def getAResult(word) 
    file = open("http://www.somapage.com?option=#{word}") 
    contents = file.read 
    file.close 
    contents.match /some-regex-here/ 
    $1.empty? ? -1 : $1.to_f 
end 

的問題是,除非我註釋掉file.closegetAResult總是-1回報。當我在控制檯上試用此代碼時,getAResult立即返回-1,但ruby進程運行另外兩到三秒左右。

如果我刪除file.closegetAResult返回正確的結果,但現在getResults是除了第一個一堆-1秒。我嘗試使用curb gem來閱讀頁面,但出現類似的問題。

這看起來像是一個與線程相關的問題。但是,我無法想出合理的方法來搜索並找到相應的解決方案。你認爲問題是什麼?

注意:我嘗試閱讀的此網頁不會如此快速地返回結果。這需要一些時間。

回答

0

嘗試hpricotnokogiri

它可以在你的HTML文件通過的XPath搜索文檔

0

你應該抓住的比賽結果,如下所示:

1.9.3-327 (main):0 > contents.match /div/ 
=> #<MatchData "div"> 
1.9.3-327 (main):0 > $1 
=> nil 




1.9.3-327 (main):0 > contents.match /(div)/ 
=> #<MatchData "div" 1:"div"> 
1.9.3-327 (main):0 > $1 
=> "div" 
+0

請再次閱讀該問題。這不是關於匹配或正則表達式。這是關於我獲得網頁內容準備和功能返回結果的時間。 – mert

0

如果你擔心線程安全性,那麼你不應該使用$ n的正則表達式變量。直接採集你的結果,如下所示:

value = contents[/regexp/] 

具體而言,這裏的該方法的一個更紅寶石狀格式:

def getAResult(word) 
    contents = open("http://www.somapage.com?option=#{word}"){|f| f.read } 
    value = contents[/some-regex-here/] 
    value.empty? ? -1 : value.to_f 
end 

#open的塊的形式(如上)自動關閉文件時你已經完成了。