質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.53%

  • Ruby

    7631questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • selenium

    502questions

    Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

配列の中に指定したワードすべてが含まれている要素の数を知りたい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 434

katsuya_ds

score 23

rubyでの質問になります。

yahooで「ファッション ブログ」で検索した時に表示されるタイトル(<h3>)に「ファッション」、「ブログ」の両方が含まれるタイトルの数を取りたいと思っております。

keyword = [ファッション ブログ,ファッション 女性]
driver.navigate.to("https://search.yahoo.co.jp/search?p=ファッション+ブログ")
h3 = driver.find_element(:id, 'WS2m').find_elements(:tag_name, 'h3')
titles = []
for i in 0..h3.count - 1
  titles << h3[i].text
end
words = keyword[0].split(" ")
matched_count = 0
matched_title_count = 0
for i in 0..titles.count - 1
  for x in 0..words.count - 1
    if titles[i].include?(words[x])
      matched_count += 1
    end
  end
  if matched_count == words.count
    matched_title_count += 1
  end
end

こう書いたのですが、matched_title_countは1となってしまいます。
実際の取得したタイトルは、

titles = ["ファッション by AmebaGG | Ameba(アメーバ)人気ブログランキング", "ファッションブログランキング|Ameba (アメーバ)", "いつたけオフィシャルブログ「ARIGATO」Powered by Ameba", "yokoオフィシャルブログ「プチプラコーデ術」Po
wered by Ameba", "40代ファッション - 人気ブログランキング", "ファッションブログ人気ランキング - ファッションブログ村 人気ブログ ...", "ファッションブログランキング - ファッション・ブランド・アクセサリー村", "大人カジュア
ル系 - ファッションブログ村", "ファッション|人気ブログランキング - 楽天ブログ", "50代になっても 洋服好き主婦のファッションブログ"]

なので、1件のみのヒットでは無いはずなのですが、理由がわかりません。

どなたか教えてくださいませ。よろしくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

matched_countが足しっぱなしになっていませんか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/22 13:50

    その通りでした!ありがとうございます!

    キャンセル

checkベストアンサー

+1

まず「あ か」を空白で分解します。つまり「あ」「か」という文字列に分けます。
次に正規表現エスケープします。この場合はメタ文字は含まれていないのでそのままで結構です。
さらにそれらを「|」で連結します。ここまでで、「あ|か」という文字列が出来上がりました。
それを使って検索してください。

追記

以上は間違いでした。どちらかが含まれるのではなくどちらも含まれるということなので、ループを使って下さい。

追記

具体的なコードをいただいたので、少し変更した次のコードを実行したところ、結果は 8 になり、成功しました。

titles = [
    "ファッション by AmebaGG | Ameba(アメーバ)人気ブログランキング",
    "ファッションブログランキング|Ameba (アメーバ)",
    "いつたけオフィシャルブログ「ARIGATO」Powered by Ameba",
    "yokoオフィシャルブログ「プチプラコーデ術」Powered by Ameba",
    "40代ファッション - 人気ブログランキング",
    "ファッションブログ人気ランキング - ファッションブログ村 人気ブログ ...",
    "ファッションブログランキング - ファッション・ブランド・アクセサリー村",
    "大人カジュアル系 - ファッションブログ村",
    "ファッション|人気ブログランキング - 楽天ブログ",
    "50代になっても 洋服好き主婦のファッションブログ"
]
words = ["ファッション","ブログ"]
matched_count = 0
matched_title_count = 0
for i in 0..titles.count - 1
  matched = true
  for x in 0..words.count - 1
    if !titles[i].include?(words[x])
      matched = false
      break
    end
  end
  if matched
    matched_title_count += 1
  end
end
print(matched_title_count);

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/22 12:41 編集

    考え方としては、まずカウンタを 0 で初期化し、要素の一つ一つについて条件を満たすかどうかを調べ、満たすならカウンタを 1 増やして最後にカウンタを出力すればいいということです。

    条件はすべての検索文字列が含まれるかどうかということなので、要素一つに対してループを使って各検索文字列でマッチングを行い、すべて成功すれば満たされたとなります。
    まずこれをサブルーチンとして実装し、それができたら先に述べたものを適用して各要素を与えるという手順で作るのが簡単だと思います。

    キャンセル

  • 2017/03/22 13:18

    本文に実際のコードを入力しました。
    ループを使ってみたのですが、正しい結果が得られません。
    ご教授いただけますでしょうか。

    キャンセル

  • 2017/03/22 13:50

    元のソースでは、ワードのどれでもヒットした場合には matched_count を増やしていたので、例えば「ファッション ファッション」でも 2 と数えていたのと、「ファッション ファッション ブログ」は 3 なので判定に失敗していたのと、そもそも matched_count を行毎にクリアしていなかったので増え続ける一方だったというのがバグでした。

    キャンセル

  • 2017/03/22 13:51

    matched_countが足しっぱなしになっていました!ありがとうございます!

    キャンセル

  • 2017/03/22 13:54

    よく考えてみたら、各語につき一回しかループしてないので、「ファッション ファッション」は 1 でした。訂正します。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby

    7631questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • selenium

    502questions

    Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。