我需要多次阅读网页内容并从中提取一些我使用正则表达式的信息。我使用open-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.close
行getAResult
始终返回-1
。当我在控制台上尝试此代码时,getAResult
会立即返回-1
,但ruby进程会再运行两到三秒左右。
如果我删除file.close
行getAResult
会返回正确的结果,但现在getResults
除了第一个-1
之外还有一堆curb
。我尝试使用{{1}} gem来阅读页面,但会出现类似的问题。
这似乎是与线程相关的问题。但是,我无法想出一些合理的搜索和找到相应的解决方案。您认为问题是什么?
注意:我尝试阅读的此网页不会如此快速地返回结果。这需要一些时间。
答案 0 :(得分:0)
答案 1 :(得分: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"
答案 2 :(得分:0)
如果您担心线程安全,那么您不应该使用$ n regexp变量。直接捕获结果,如下所示:
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(如上所述)的块形式会在您完成后自动关闭文件。