在ruby中读取几个URI

时间:2012-12-13 09:39:11

标签: ruby file-io

我需要多次阅读网页内容并从中提取一些我使用正则表达式的信息。我使用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.closegetAResult始终返回-1。当我在控制台上尝试此代码时,getAResult会立即返回-1,但ruby进程会再运行两到三秒左右。

如果我删除file.closegetAResult会返回正确的结果,但现在getResults除了第一个-1之外还有一堆curb。我尝试使用{{1}} gem来阅读页面,但会出现类似的问题。

这似乎是与线程相关的问题。但是,我无法想出一些合理的搜索和找到相应的解决方案。您认为问题是什么?

注意:我尝试阅读的此网页不会如此快速地返回结果。这需要一些时间。

3 个答案:

答案 0 :(得分:0)

尝试hpricotnokogiri

它可以在你的html文件中通过XPath搜索文件

答案 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(如上所述)的块形式会在您完成后自动关闭文件。