2011-06-03 60 views
1

我使用'net/http'和'uri'檢索NCBI在線Blast工具的結果。爲此,我必須通過html頁面搜索來檢查其中一行是「Status = WAITING」還是「Status = READY」。 Blast工具完成後,狀態將變爲就緒,結果將發佈在html頁面上。根據頁面結果延遲一種方法

我有一個工作版本來檢查狀態,然後檢索我需要的信息,但效率低下,並且當我相信可以通過某種方式將它們合併成一個方法時,它被分解爲兩種方法。

def waitForBlast(rid) 
    get = Net::HTTP.post_form(URI.parse('http://www.ncbi.nlm.nih.gov/blast/Blast.cgi?'), {:RID => "#{rid}", :CMD => 'Get'}) 
    get.body.each{|line| (waitForBlast(rid) if line.strip == "Status=WAITING") if line[/Status=/]} 
end 

def returnBlast(rid) 
    blast_array = Array.new 
    get = Net::HTTP.post_form(URI.parse('http://www.ncbi.nlm.nih.gov/blast/Blast.cgi?'), {:RID => "#{rid}", :CMD => 'Get'}) 
    get.body.each{|line| blast_array.push(line[/<a href=#\d+>/][/\d+/]) if line[/<a href=#\d+>/]} 
    return blast_array 
end 

第一種方法是檢查狀態,是我最關心的,因爲它是遞歸的。我相信(並糾正我,如果我錯了),設計爲是需要太多的計算能力,當我需要的是某種方式來重新檢查在同一方法的結果(延長時間是一個獎金)。第二種方法很好,但我更喜歡它是否與第一種方法相結合。任何幫助讚賞。

+0

沒有看到HTML很難說,但我懷疑你可以使用字符串內搜索來簡化你的搜索。另外,除了最瑣碎的解析任務之外,解析器將長期爲您節省很多痛苦。我推薦Nokogiri。另外,看看使用Ruby的內置'Open :: URI'。與'Net :: HTTP'和'URI'相比,它更容易使用。 – 2011-06-03 23:06:48

+0

另外,如果'rid'還不是字符串,那麼你的''#{rid}''可以簡化爲'rid'或'rid.to_s'。 – 2011-06-03 23:10:26

回答

0

看看this的實現。這是他做什麼:

res='http://www.ncbi.nlm.nih.gov/blast/Blast.cgi?CMD=Get&FORMAT_OBJECT=SearchInfo&RID=' + @rid 
while status = open(res).read.scan(/Status=(.*?)$/).to_s=='WAITING' 
    @logger.debug("Status=WAITING") 
    sleep(3) 
end 

我認爲使用字符串掃描儀可能會有點比頁每一行遍歷更有效率,但我還沒有看它的實現,所以我可能是錯的。

+0

您能向我解釋@ logger.debug(「Status = Waiting」)嗎?我不熟悉它。 – scradge 2011-06-03 21:21:33

+0

這只是打印'狀態= WAITING'到紅寶石控制檯。見[this](http://ruby.about.com/od/tasks/a/logger.htm)。 – David 2011-06-03 21:22:52