0

Web ページのコンテンツを数回読み取り、そこから正規表現を使用して情報を抽出する必要があります。私は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問題は、行getAResultreturn alwaysをコメントアウトしない限りです-1。このコードをコンソールで試すと、getAResultすぐに が返されます-1が、さらに 2 ~ 3 秒ほど ruby​​ プロセスが実行されます。

file.close行を削除するとgetAResult、正しい結果が返されますが、最初のものを除いてgetResults一連のs になります。-1ページの読み込みに gemを使用しようとしましcurbたが、同様の問題が発生します。

これは、スレッドに関連する問題のようです。しかし、検索して対応する解決策を見つけるのに合理的なものを思いつくことができませんでした。何が問題になると思いますか?

注: 私が読もうとしているこの Web ページは、それほど速く結果を返しません。時間がかかります。

4

3 に答える 3

0

hpricotまたはnokogiriを試してください

HTMLファイル内のXPathを介してドキュメントを検索できます

于 2012-12-13T10:11:29.960 に答える
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 (上記のように) は、ファイルの処理が完了すると、ファイルを自動的に閉じます。

于 2012-12-13T23:24:32.560 に答える
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 に答える