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

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

新規登録して質問してみよう
ただいま回答率
85.48%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Ruby

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

selenium

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

Q&A

解決済

2回答

2229閲覧

【Ruby】seleniumでメタ情報を取得したい

kaori_oka

総合スコア176

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Ruby

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

selenium

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

0グッド

1クリップ

投稿2020/01/24 10:00

前提・実現したいこと

seleniumでサイト調査をしておりまして、その中でメタ情報を取得をしたいのですが、
思うような値がとれませんでした。

発生している問題

メタ情報を取得してputsで表示すると下記のような文字列がターミナルに出力されます。

console

1#<Selenium::WebDriver::Element:0x00000000065c9468>

該当のソースコード

ruby

1require "selenium-webdriver" 2driver = Selenium::WebDriver.for :chrome 3~省略~ 4page_title = driver.find_elements(:xpath, "//title") 5puts page_title 6# => #<Selenium::WebDriver::Element:0x00000000065c9468>

試したこと

取得した情報のURLを取り出すときは、
ele.attribute('href')のようにすると取り出せたので、下記を試してみました。

ruby

1page_title.attribute('text') 2page_title.attribute('value')

どちらも、下記のエラーで処理が止まってしまいます。

console

1 `block in <main>': undefined method `attribute' for #<Array:0x00000000065e4fb0> (NoMethodError)

他の方法で値を取り出すのでしょうか。
ご存知の方いましたら教えていただきたく!

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

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

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

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

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

guest

回答2

0

driver.find_elements なので、Element の配列になっているのでは?

`block in <main>': undefined method `attribute' for #<Array:0x00000000065e4fb0> (NoMethodError)

エラーメッセージからすると、Arrayattribute メソッドがないと言っています。
まずは、エラーメッセージをよく読みましょう。

投稿2020/01/24 10:05

taichi730

総合スコア318

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

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

kaori_oka

2020/01/27 01:26

ご返答ありがとうございます。 Elementの配列とは、 ``[a,b,c,d]``のような形式ということでしょうか。 でもそうしたらputsで``[a,b,c,d]``のように出力されるのかな?と思ったのですが。 取得元サイトにtitleタグがあるので、gemがちゃんと動いているであれば値が取れるとおもうのですが.... #<Selenium::WebDriver::Element:0x00000000065c9468> ↑これがなんだがよくわかっていなくて...
taichi730

2020/01/27 01:35

配列を puts に渡した場合、以下のように出力されます。 irb(main):001:0> a = [Object.new] irb(main):002:0> puts a #<Object:0x0000000006c98aa0> => nil なので、質問にある puts の出力はあり得る出力です。 まずは、find_elements が何を返すか、リファレンスで調べてみては?
kaori_oka

2020/01/27 02:44

純rubyでもbindyng.pry的なものってあるのでしょうか?? たぶん、実行途中の「#<Selenium::WebDriver::Element:0x00000000065c9468>」の中身がどうか見たほうがよさそうですよね。 取得元ページにはdescriptionとkeywordsが設定されていないのですが、 それを取得して代入した変数をputsすると何も表示されないので、 「#<Selenium::WebDriver::Element:0x00000000065c9468>」これとはなにかが違うので... https://www.rubydoc.info/gems/selenium-webdriver/Selenium%2FWebDriver%2FSearchContext:find_elements 上記のようなリファレンス読んでみましがた、「指定された引数に一致するすべての要素を検索します」と書いてあり、要素があればかえって来るそうだったので、 返り値の「#<Selenium::WebDriver::Element:0x00000000065c9468>」をどう扱うのだろう... って感じです
taichi730

2020/01/27 02:53

bindyng.pry は使ったことがないので、よく分かりません。 puts の代わりに p を使ってみては?
taichi730

2020/01/27 02:55

また、リファレンスには実装されているコードも載っています。 そこから、追ってみるのも良いかと思います。
kaori_oka

2020/01/27 03:25

pで見たところ、[#<Selenium::WebDriver::Element:0x1994d8ee id="ffcbcc10-9caa-4ddb-872b-088fbebe68aa">]となっていたので デバックツールで途中で止めてirbで見てみました ------------ [1] pry(main)> page_title => [#<Selenium::WebDriver::Element:0x1994d8ee id="ffcbcc10-9caa-4ddb-872b-088fbebe68aa">] [2] pry(main)> page_title[0] => #<Selenium::WebDriver::Element:0x1994d8ee id="ffcbcc10-9caa-4ddb-872b-088fbebe68aa"> [3] pry(main)> page_title[0].to_s => "#<Selenium::WebDriver::Element:0x0000000006848608>" [4] pry(main)> page_title[0].text => "" [5] pry(main)> page_description => [] ------------ [4] pry(main)> page_title[0].text => "" となるので、取得がうまくいっていないのか?と思うのですが 完全に存在してないdescriptionだと下記のようになっているので、 [5] pry(main)> page_description => [] titleタグは取得できているけど、中身のテキストが取れてないという感じなのかな?と感じました。
kaori_oka

2020/01/27 03:26

実装コードはちょっとむずかしくてよくわからなかったので、 titleじゃない要素は取れるのか見てみようかと思います
kaori_oka

2020/01/27 07:06

qiitaに良い記事があり、実装できました! ありがとうございました!
guest

0

自己解決

seleniumでmetaタグ出力メモ

上記のサイトを参考に、
下記のようにすることで、値を取り出すことができました。

ruby

1require "selenium-webdriver" 2 3driver = Selenium::WebDriver.for :chrome 4 5driver.navigate.to "https://chiebukuro.yahoo.co.jp/" 6 7page_title = driver.title 8page_description = driver.find_elements(:xpath, "//meta[@name='description']") 9page_keywords = driver.find_elements(:xpath, "//meta[@name='keywords']") 10 11puts "page_title" 12puts page_title 13puts "page_description" 14puts page_description[0].attribute('content') 15puts "page_keywords" 16puts page_keywords[0].attribute('content')

console

1page_title 2Yahoo!知恵袋 - みんなの知恵共有サービス 3page_description 4みんなでつくる便利でうれしい知恵の共有サービス。参加している方がお互いに 5知恵や知識をQ&Aで共有できるサイトです。 6page_keywords 7知恵,知識,質問,回答,悩み,相談,解決,教えて,疑問,意味,方法

投稿2020/01/27 07:04

kaori_oka

総合スコア176

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問