ある文字列の間の文字だけを取得すにはどうすればよいでしょうか?rubyの質問です。

文字列というよりスレイピングしたhtmlの中から抜き出したいのですが。
下記のようなソースを抜出し.to_sを利用して文字列にしたとします。
<input type="hidden" name="input" value="sitename" />
この中で欲しい文字列がvalueの中に含まれる「sitename」だとします。
他の箇所はそのまですが、肝心のsitenameは取ってくるページによって変化します。
たぶん正規表現かgsubを使えばいいのかなと思っているのですが、いざやってみるとイメージようにうまく抜き出すことができません。抜き出せてもやたら長いソースコードになってしまいます。
スマートに短いソースで「sitename」の箇所だけを抜き出す方法はありませんか?

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2013/02/25 23:25:21
  • 終了:2013/03/01 12:00:33

ベストアンサー

id:a-kuma3 No.1

a-kuma3回答回数4365ベストアンサー獲得回数18012013/02/25 23:39:18

質問がふわっとしているので、探り気味に。

スクレイピングだと、書き捨てのスクリプトも多いので、ぼくは、こんな感じで書くことが多いです。

while 一行ずつのループ
    line = ...                                  # 一行の文字列のつもり
    if /<input .*name="input"/ =~ line then     # 抽出対象の行を特定する if のつもり
        if /value="([^"]+)"/ =~ line then       # value の値をグループ化する正規表現でマッチ
            puts $1                             # グループ化した対象を $1 で抽出
        end
    end
end

最初は、一番内側の if が無い状態で試して、抽出対象の行だけを抜き出せるかを確認してから、その行から対象の文字列を抜き出す。
文字列を抜き出すときは、正規表現でマッチして () でグルーピングして取り出すのが分かりやすいです。
正規表現が長くなると、ソースが水楽なるので、こんな感じで書くことも。

RE_LINE = /<input .*name="input"/
RE_WORD = /value="([^"]+)"/
while 一行ずつのループ
    line = ...                      # 一行の文字列のつもり
    if RE_LINE =~ line then         # 抽出対象の行を特定する if のつもり
        if RE_WORD =~ line then     # value の値をグループ化する正規表現でマッチ
            puts $1                 # グループ化した対象を $1 で抽出
        end
    end
end
id:osietekudasaibadr

a-kuma3さんいつもありがとうございます。
ご回答いただいた通りにやってみたら、思う通りの結果ができました。
ほんとうにありがとうございます!

2013/03/01 12:01:49

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません