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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

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

selenium

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

Q&A

解決済

2回答

1414閲覧

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

katsuya_ds

総合スコア35

Ruby

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

selenium

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

0グッド

0クリップ

投稿2017/03/22 03:12

編集2017/03/22 04:22

rubyでの質問になります。

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

ruby

1keyword = [ファッション ブログ,ファッション 女性] 2driver.navigate.to("https://search.yahoo.co.jp/search?p=ファッション+ブログ") 3h3 = driver.find_element(:id, 'WS2m').find_elements(:tag_name, 'h3') 4titles = [] 5for i in 0..h3.count - 1 6 titles << h3[i].text 7end 8words = keyword[0].split(" ") 9matched_count = 0 10matched_title_count = 0 11for i in 0..titles.count - 1 12 for x in 0..words.count - 1 13 if titles[i].include?(words[x]) 14 matched_count += 1 15 end 16 end 17 if matched_count == words.count 18 matched_title_count += 1 19 end 20end

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

ruby

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

投稿2017/03/22 04:50

torisan

総合スコア678

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

katsuya_ds

2017/03/22 04:50

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

0

ベストアンサー

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

追記

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

追記

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

Ruby

1titles = [ 2 "ファッション by AmebaGG | Ameba(アメーバ)人気ブログランキング", 3 "ファッションブログランキング|Ameba (アメーバ)", 4 "いつたけオフィシャルブログ「ARIGATO」Powered by Ameba", 5 "yokoオフィシャルブログ「プチプラコーデ術」Powered by Ameba", 6 "40代ファッション - 人気ブログランキング", 7 "ファッションブログ人気ランキング - ファッションブログ村 人気ブログ ...", 8 "ファッションブログランキング - ファッション・ブランド・アクセサリー村", 9 "大人カジュアル系 - ファッションブログ村", 10 "ファッション|人気ブログランキング - 楽天ブログ", 11 "50代になっても 洋服好き主婦のファッションブログ" 12] 13words = ["ファッション","ブログ"] 14matched_count = 0 15matched_title_count = 0 16for i in 0..titles.count - 1 17 matched = true 18 for x in 0..words.count - 1 19 if !titles[i].include?(words[x]) 20 matched = false 21 break 22 end 23 end 24 if matched 25 matched_title_count += 1 26 end 27end 28print(matched_title_count);

投稿2017/03/22 03:35

編集2017/03/22 04:47
Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2017/03/22 03:43 編集

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

2017/03/22 04:18

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

2017/03/22 04:50

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

2017/03/22 04:51

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

2017/03/22 04:54

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問