• 締切済み

配列のから一致する文字列を検索して1行下の数値を取得する方法

どうもはじめまして。 どなたかperlの詳しい方、アドバイスをいただけないでしょうか。。 タイトルの通り配列の中から一致する文字列を検索して 1行下の数値を取得する方法が知りたいです。 簡単に言えば、、 ・キーワード解析のページにアクセスし、結果HTMLソースを取得します  ※ここまではできてます ・取得したHTMLソースからキーワードの検索回数を抜き出したいのですが、下記のようなソースになっています。 ■HTMLソース 一部抜粋 ---- <タグ>google で 「ほげ」 を検索した結果<タグ> <タグ> 35,233回<タグ> <タグ>google で 「ほげ」 +αを検索した結果<タグ> <タグ> 5,095回<タグ>         ・         ・ αの部分はアンド検索などで一緒に検索された文字を示す ---- 抜き出したいのは「ほげ」のみの検索回数 35,233 の値です。 この値をどのように取得してよいか、効率的な方法が思い浮かびません。 どなたかアドバイスいただけないでしょうか、よろしくお願い致します。 m(_ _ )m

  • Perl
  • 回答数4
  • ありがとう数1

みんなの回答

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.4

No3 の補足に書いてある正規表現 m[<td>([\d,])+回</td>] の + を 丸かっこの内側に入れて、m[<td>([\d,]+)回</td>] のようにすれば 取得できるように思います。 my $prev; foreach my $line (@array) { if ($prev =~ /<タグ>.*?「ボケ」を/) { $line =~ /<td>([\d,]+)回/; print "$1\n"; } $prev = $line; }

s15boxer
質問者

お礼

遅くなりました。。 とても参考になり、完成に近づきました。 ありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

考えるのが面倒なら, フラグを用意して foreach でまわすのが簡単かな. my $flag = 0; foreach $line (@lines) { if ($flag == 0) { if ($line =~ m[<タグ>.*?「ほげ」を.*?</タグ>]) { $flag = 2; } else { $flag = 1; } else { if ($flag == 2) { $line =~ m[<タグ>([\d,]+回</タグ>]; print "$1\n"; } $flag = 0; } } みたいに誤魔化す感じ? いずれにしても, 検索回数はパターンマッチングで取るのが Perl的な感じがします. 「タグ」というだけではわからんので, もうちょっとわかりやすくしてほしい (#1 への補足で「別のタグ」と書かれていますが, 実際にはどのようになっているかがあるともっと書きやすいなぁ) ですが. あとは, 拡張性をどこまで考慮するか, ですかねぇ.

s15boxer
質問者

補足

返答遅くなりました。。 タグは<td>35,233 回</td>となります。 やはり、パターンマッチングで取得するのが最適ですかね?? となるとカンマ(,)が結構厄介だったりしますm(_ _)m m[<td>([\d,])+回</td>]だとカンマが入っていると取得できないですよね。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

えっと, 「2行にわかれている」から面倒なのであって, 1行にしちゃったらいいんじゃないかなぁ.

s15boxer
質問者

補足

確かに改行を空白に置換して、一行にしようとも考えましたが、 何をキーにして<タグ>35,233回</タグ>の数値だけを取り出すかが 思いつきませんでした。。 substr で取得しようかとおもったのですが、ソース全体が結構な量なのと、 検索ワードの文字数によっては開始位置が変わってしまうので。。

回答No.1

補足要求です 1行目 <タグ>google で 「ほげ」 を検索した結果<タグ> のタグと、 2行目 <タグ> 35,233回<タグ> のタグは別のタグですか? それとも同じタグですか? それと、1行目、2行目のそれぞれの終わりのタグは終了タグ( </ ...> ) と考えてよろしいでしょうか。

s15boxer
質問者

補足

1行目、2行目は別のタグで、それぞれ終わりのタグは終了タグ( </...> ) です。 よろしくお願い致します。

関連するQ&A

  • 画面から文字列を取得してその文字列の位置を知る方法

    こんばんは。 質問させてください。 画面から文字列を選択して、取得します。(これは出来ました。) その文字列がHTMLソースファイルの どの位置のものか取得する方法はありますでしょうか? ○番目の「こんばんは」を画面から取得した時に 同じ文字列があっても、○番目の位置が取得出来る方法なのですが・・・ ---- <HTML><HEAD></HEAD> <BODY> おはよう、こんばんは。 さようなら、ありがとう。 しつれいしました、おはよう、こんばんは。 こんばんは、さようなら。 さようなら </BODY> </HTML> ----

  • yahooの検索ランキングの取得方法

    yahooの検索ランキングの取得方法 PHPにより、正規表現を使用してyahooの検索ランキングを取得しようと考えています。 googleやbingについては問題なく取得できたのですが、yahooのみうまく取得できません。 以下詳細を記述します 1.file_get_contents()により、 (http://search.yahoo.co.jp/search?ei=UTF-8&fr=top_ga1_sa&x=wrt&p=キーワード) のURLのファイルを取得 2. 1.で取得したファイルから正規表現により<div class="hd">というタグを検索 し、タグからタグまでの文字列を順番に配列に保存 3.取得した配列から指定キーワードを検索し、マッチした配列の順番を取得し、ランクとして表示 取得できないのがyahooだけであることからURLの指定ミスかと思ったのですが、ブラウザで確認すると 表示されています。また、検索するタグの問題かと思い別のものをしてみても問題は解決されませんでした。 どなたかお詳しい方がいらしたら是非ともご教示よろしくお願い致します。

    • ベストアンサー
    • PHP
  • 文字列検索について

    Googleなどの検索サイトのキーワード検索は、ユーザーと入力してもユーザがヒットする検索が出来ています。また、全角半角区別なしで文字列の検索をするにはどのようにしたらいいのでしょうか? よろしくお願い致します。

  • 検索エンジンでの検索結果の取得

    現在PHPで検索エンジンの統合ポータルの作成を考えています。 Google、Yahoo(ページ検索)で特定の単語を検索した結果の総数を簡単に取得する方法をご存じでしたらお教えいただければと思います。(特定のパラメータを送ると、検索結果総数だけ返す方法とかが有れば・・・。) 例)キーワード「検索エンジン」で検索した場合、Yahooページ検索「5230344件」、Google「約 3,100,000 件」 やはりGoogleの場合でしたらGoogleAPIを使用するか、もしくはそれぞれ結果画面のソースを正規表現等で解析するしか方法は無いのでしょうか?

    • ベストアンサー
    • PHP
  • Googleの検索結果数を取得したい

    複数キーワードで、Google検索結果数をそれぞれ取得したいのですが、 どうすればよいでしょうか? 想定としては、 配列か何かに、複数のキーワードを入れて(例えば、東京タワー、スカイツリー)、 それをどこかへ投げると、 Google検索結果数を取得して返って来る、ってな感じです。 参考になるサイト等ご存知の方は教えてください

    • ベストアンサー
    • PHP
  • php検索文字列のハイライト表示

    phpの検索処理で、検索キーワードにマッチした文字列を強調表示(<strong>)して表示したいのですが、タグ文字の処理でわからないことがあります。 例えば 「<a href="test">tes;t</a>」というデータがあり(現状すべてエスケープして表示)、キーワード「</」で検索したとき、該当文字列に<strong>タグをつけた後にエスケープすると<strong>タグまでエスケープされてしまい、強調表示ができません。検索前にエスケープしてしまうとキーワード「;」で検索した時に全てのタグ文字の後に強調された「;」が表示されてしまいます。 どなたかうまい解決方法があれば教えていただきたいです。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • table を配列で取得

    HTML のtableタグで生成した表の各セルの値を、 PHPの配列で取得するやり方があるらしいのですが。 どのように記述するのでしょうか? サンプル等がありましたら、教えてください。

    • ベストアンサー
    • PHP
  • Googleの検索でハイフンを含む文字列を検索したい場合

    Googleのキーワードでハイフン (-)は接続記号 として処理されフレーズ検索となってしまいます. ハイフンを含んだ文字列だけを検索する方法は ないのでしょうか? たとえば, 「EOS-20D」というハイフンを含んでいる文字列 だけのサイトを表示しようとしても, 「EOS 20D」 が多くヒットしてしまいます. 「"」(ダブルコーテション)で括っても結果は同じ. ハイフンを接続記号ではなく,文字列の一部として 検索する方法はないものでしょうか? よろしくお願いいたします. http://www.google.co.jp/intl/ja/help/refinesearch.html#phrase

  • [Ctrl]+[F] 検索する文字列 → でヒットしない文字列

    エクセルで作った文書をHTML形式で保存(拡張子.htm)   ↓ インターネット上にアップロード   ↓ キーワードで検索するときは [Ctrl]+[F] 検索する文字列 → " " で検索してもらう。 さて、この検索において 明らかにそのウェブページに存在するキーワードを検索したのに [ドキュメントの検索が終了しました]というメッセージが出て ヒットしないことがあります。 これはどのようなことが考えられますでしょうか。 よろしくお願い申し上げます。

  • サイト内検索キーワードの取得について

    あるホームページのサイト内検索のキーワードを取得するJavaScriptを組みたいのですが、どうも日本語のキーワードが文字化けしてしまいます。 検索キーワード入力画面の文字コードは「shift_jis」、検索結果ページは、文字コード「UTF-8」です。 たとえば、「質問」とキーワードを入れると、URLのバーには「%8E%BF%96%E2」と表示されます。 この「%8E%BF%96%E2」をデコードして、検索キーワードのデータを取得するJavaScriptはどのように組めばいいでしょうか? ちなみに、現在、前後は省略しますが、以下の通り記述しています。 hensu1に日本語の文字しないキーワードが取得したいのです。 mydecode=QueryParam('Q'); //Qのパラーメタ(検索キーワード)取得 hensu1=unescape(mydecode);

専門家に質問してみよう