#ruby-on-rails #ruby
#ruby-on-rails #ruby
Вопрос:
Я извлекаю результаты из онлайн-инструмента NCBI Blast с помощью «net / http» и «uri». Для этого мне нужно выполнить поиск по HTML-странице, чтобы проверить, является ли одна из строк «Статус = ОЖИДАНИЕ» или «Статус = ГОТОВНОСТЬ». Когда инструмент 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
Первый метод проверяет статус и является моей главной заботой, потому что он рекурсивный. Я считаю (и поправьте меня, если я ошибаюсь), что разработка «как есть» требует слишком больших вычислительных мощностей, когда все, что мне нужно, это какой-то способ перепроверить результаты в рамках того же метода (добавление временной задержки является бонусом). Второй метод хорош, но я бы предпочел, чтобы он каким-то образом сочетался с первым. Любая помощь приветствуется.
Комментарии:
1. Не видя HTML, трудно сказать, но я подозреваю, что вы могли бы немного упростить свой поиск, используя поиск по тексту в строке. Кроме того, для любых задач, кроме самых тривиальных, синтаксический анализатор избавит вас от многих хлопот в долгосрочной перспективе. Я рекомендую Nokogiri. Кроме того, посмотрите на использование встроенного в Ruby
Open::URI
. Это намного проще в использовании по сравнению сNet::HTTP
иURI
.2. Кроме того, ваш
"#{rid}"
можно упростить доrid
или,rid.to_s
еслиrid
это еще не строка.
Ответ №1:
Взгляните на эту реализацию. Это то, что он делает:
res='http://www.ncbi.nlm.nih.gov/blast/Blast.cgi?CMD=Getamp;FORMAT_OBJECT=SearchInfoamp;RID=' @rid
while status = open(res).read.scan(/Status=(.*?)$/).to_s=='WAITING'
@logger.debug("Status=WAITING")
sleep(3)
end
Я думаю, что использование сканера строк может быть немного более эффективным, чем перебор каждой строки на странице, но я не смотрел на его реализацию, поэтому я могу ошибаться.
Комментарии:
1. Не могли бы вы объяснить мне @logger.debug(«Статус = Ожидание»). Я не знаком с этим.
2. Это просто выводится
Status=WAITING
на консоль ruby. Смотрите это .