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

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

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

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

3回答

2328閲覧

youtube でリンクを取得したいのですが、正規表現がうまくいきません

bouyomisan

総合スコア87

Ruby

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2017/04/07 00:49

search_term = URI.encode(title) search_url = "https://www.youtube.com/results?search_query=#{search_term}" puts search_url doc = Nokogiri::HTML(open(search_url)) #写真のようにリンク付きタイトルの部分 elements = doc.xpath("//h3['yt-lockup-title']/a") elements.each do |a| #code は /watch?v=KM4Xe6Dlp0Y&list=PLMpKNooZZUQsudyHWAxb7UfiKQtDzdmdM #こんな感じの文字列 code = a.attributes['href'].value #そこから /watch?v= と & に囲まれた KM4Xe6Dlp0Y を取得したい puts code.match(/\/watch\?v\=(.+)\&/)[1] end

イメージ説明

コードのコメント欄のように

/watch?v=KM4Xe6Dlp0Y&list=PLMpKNooZZUQsudyHWAxb7UfiKQtDzdmdM

という文字列から /watch?v= と & にかこまれた KM4Xe6Dlp0Y というのを抽出したいです。
だから puts code.match(/\/watch\?v\=(.+)\&/)[1] こうやったのですが出てくるものは/watch?v=KM4Xe6Dlp0Y& というように watch などがひっついてきます。これをのけたいのですが、どういう正規表現を使えばいいのでしょうか?

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

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

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

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

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

guest

回答3

0

ベストアンサー

「正規表現を扱う」という問題が増えてしまうので、URL をパースする標準ライブラリの使用をされたほうが、簡単に問題を解決できるように思います

(下に例示したコードを、実際の処理に組み込んでみてください)

ruby

1require 'uri' 2 3def uri_params(uri_string) 4 uri = URI::parse(uri_string) 5 queries = URI::decode_www_form(uri.query) 6 Hash[queries] 7end 8 9title = 'foo' 10search_term = URI.encode(title) 11search_url = "https://www.youtube.com/results?search_query=#{search_term}" 12puts search_url # => https://www.youtube.com/results?search_query=foo 13 14params = uri_params(search_url) 15p params['search_query'] # => foo

何か参考になれば幸いです

Link

投稿2017/04/07 08:45

編集2017/04/07 08:54
gouf

総合スコア2321

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

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

bouyomisan

2017/04/10 07:02

こんなのもあるのですね! きれいに抜けました。ありがとうございます
guest

0

Ruby

1code = "/watch?v=KM4Xe6Dlp0Y&list=PLMpKNooZZUQsudyHWAxb7UfiKQtDzdmdM" 2 3puts code.match(/\/watch\?v\=(.+)\&/)[1]

結果

KM4Xe6Dlp0Y

Windows版のRuby2.2.6だと質問者様の正規表現で綺麗に抜けていました。

投稿2017/04/07 08:24

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

bouyomisan

2017/04/10 07:01

そうなのですか!? こちら ubuntu でやってるのですが、うまくいきませんでした
guest

0

.+

これを

[^&]+

これに変えてみてください。

投稿2017/04/07 00:54

Zuishin

総合スコア28660

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問