我正在使用'net / http'和'uri'从NCBI的在线Blast工具中检索结果。为此,我必须搜索html页面以检查其中一行是“Status = WAITING”还是“Status = READY”。当Blast工具完成后,状态将变为ready并且结果将发布在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 :(得分: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
我认为使用字符串扫描程序可能比迭代页面中的每一行更有效,但我没有看过它的实现,所以我可能错了。