0

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

如果我删除file.closegetAResult返回正确的结果,但现在getResults是一堆-1s 除了第一个。我尝试使用curbgem 来阅读页面,但出现了类似的问题。

这似乎是与线程相关的问题。但是,我无法提出合理的搜索并找到相应的解决方案。你认为问题会是什么?

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

4

3 回答 3

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"
于 2012-12-13T10:26:03.227 回答
0

如果您担心线程安全,则不应使用 $n 正则表达式变量。直接捕获结果,如下所示:

value = contents[/regexp/]

具体来说,这是该方法的更类似于 ruby​​ 的格式:

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

于 2012-12-13T23:24:32.560 回答
0

试试hpricotnokogiri

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

于 2012-12-13T10:11:29.960 回答