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

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

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

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

Q&A

解決済

2回答

1626閲覧

[Ruby]webスクレイピング

ruby_11

総合スコア37

Ruby

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

0グッド

0クリップ

投稿2017/07/20 13:39

webスクレイピングで、<span>の中身をとりだしたいんですが、上手く実行されません。

HTML内で求めるspanが何番目にあるか数えたり、検索機能で調べたり、コード内の変数を変えたりして試しましたが、上手く処理されませんでした。

spanの一覧を表示させても上手くいかなかったので、HTMLをターミナルで表示させてみると、求めているspanが表示されていませんでした。

おそらく、そこに原因があると思うのですが、どうすれば求めたいspanの要素を抽出することができるでしょうか?

ちなみに利用するURLは以下の通りです。

https://www.ted.com/talks/adam_grant_the_surprising_habits_of_original_thinkers

HTML内の<span>February 2016</span>からFebruary 2016を抽出したいです。

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

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

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

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

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

guest

回答2

0

HTMLソースには存在せず、JavaScriptで生成されたタグではないでしょうか。
Seleniumのような、ブラウザを自動運転するようなツールを使ってください。

投稿2017/07/20 13:57

otn

総合スコア84423

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

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

ruby_11

2017/07/21 03:38

回答ありがとうございます。 Seleniumは使用したことないので、試してみたいと思います。
guest

0

ベストアンサー

Ruby

1# encoding: utf-8 2 3require 'open-uri' 4require 'certified' 5 6url = 'https://www.ted.com/talks/adam_grant_the_surprising_habits_of_original_thinkers' 7 8data = open(url, &:read) 9 10data =~ /<meta content=(.+?) itemprop='uploadDate'>/ 11 12p $1 # => 2016-04-01T14:47:47+00:00 13

投稿された日付を取り出すなら、より詳しい日付がhtmlに書かれていました。
ここから、年月をとって、月を英語に直すというのはどうでしょうか。

#追記
勘違いでした。

もしかしてこれかもしれません。

Ruby

1# encoding: utf-8 2 3require 'open-uri' 4require 'certified' 5require 'date' 6 7url = 'https://www.ted.com/talks/adam_grant_the_surprising_habits_of_original_thinkers' 8 9data = open(url, &:read) 10 11data =~ /"recorded_at":"(.+?)"/ 12 13d = DateTime.parse($1) 14 15puts d.strftime('%B %Y') # => February 2016 16

Nokogiriを使おうとしたバージョン

Ruby

1# encoding: utf-8 2 3require 'open-uri' 4require 'certified' 5require 'date' 6require 'nokogiri' 7 8url = 'https://www.ted.com/talks/adam_grant_the_surprising_habits_of_original_thinkers' 9 10doc = Nokogiri::HTML.parse(open(url)) 11 12data = doc.xpath('//script').text 13 14data =~ /"recorded_at":"(.+?)"/ 15 16d = DateTime.parse($1) 17 18puts d.strftime('%B %Y') # => February 2016 19

参考にしたページ
Rubyで文字列を日時に変換する方法
指定フォーマットで文字列に変換する

私のブラウザなど
Chrome 59.0.3071.115
Windows 10

#追記

Ruby

1# encoding: utf-8 2 3require 'open-uri' 4require 'certified' 5 6url = 'https://www.ted.com/talks/adam_grant_the_surprising_habits_of_original_thinkers' 7 8data = open(url, &:read) 9 10data =~ /"events":\[{"id":\d+,"name":"(.+?)"}\],"/ 11 12puts $1 # => TED2016

投稿2017/07/20 14:37

編集2017/07/22 06:22
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ruby_11

2017/07/21 03:37

回答ありがとうございます。 DateTimeを使用したことはなかったので、新しい知識となりました。 ただ、他の要素にも適応したいので、otnさんが仰っているSeleniumというのも試したいと思います。
ruby_11

2017/07/21 04:09

ちなみになんですが、<span>February 2016</span>は上のコードで処理できたんですが、<span>February 2016</span>の下にある、<span>TED2016</span>の取得について教えていただいてもいいでしょうか? Seleniumは理解に苦しみました。。。
退会済みユーザー

退会済みユーザー

2017/07/21 04:53

htmlの<script>内の"events":[{"id":377,"name":"TED2016"}],"の部分だと思います。
ruby_11

2017/07/21 06:23

capybaraなどを試したりしましたが、どうも<script>内のeventsの要素を取り出すことができません。
退会済みユーザー

退会済みユーザー

2017/07/21 09:08

私の回答に追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問