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

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

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

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

Q&A

解決済

2回答

1046閲覧

Rubyのeachで配列に格納する方法 Nokogiri

re_refuse

総合スコア17

Ruby

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

0グッド

1クリップ

投稿2019/08/01 00:57

編集2019/08/01 01:12

nokogiriでスクレイピングをしているのですが、スクレイピングした結果を配列に格納したいです。

ruby

1$lessonOnclick = [] 2$i=0 3lessons.each do |lesson| 4 $i=$i+1 5 $lessonsOnclick[$i] << lessons.at_css('a')[:onclick] 6 puts $lessonsOnclick[$i] 7end

エラー内容

Ruby

1Traceback (most recent call last): 2 4: from test.rb:38:in `<main>' 3 3: from /Users/yasoda/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/nokogiri-1.10.3/lib/nokogiri/xml/node_set.rb:237:in `each' 4 2: from /Users/yasoda/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/nokogiri-1.10.3/lib/nokogiri/xml/node_set.rb:237:in `upto' 5 1: from /Users/yasoda/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/nokogiri-1.10.3/lib/nokogiri/xml/node_set.rb:238:in `block in each' 6test.rb:40:in `block in <main>': undefined method `[]' for nil:NilClass (NoMethodError)

よろしくお願いします...

試したこと

Ruby

1$lessonOnclick = [] 2$i=0 3lessons.each do |lesson| 4 $i=$i+1 5 $lessonsOnclick << lessons.at_css('a')[:onclick] //変更 6 puts $lessonsOnclick[$i] 7end
Traceback (most recent call last): 4: from test.rb:38:in `<main>' 3: from /Users/yasoda/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/nokogiri-1.10.3/lib/nokogiri/xml/node_set.rb:237:in `each' 2: from /Users/yasoda/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/nokogiri-1.10.3/lib/nokogiri/xml/node_set.rb:237:in `upto' 1: from /Users/yasoda/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/nokogiri-1.10.3/lib/nokogiri/xml/node_set.rb:238:in `block in each' test.rb:40:in `block in <main>': undefined method `<<' for nil:NilClass (NoMethodError)

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

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

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

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

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

guest

回答2

0

ベストアンサー

Rubyのeachで配列に格納する方法

eachではなくmapを使えば、ブロックの中身から配列を生成できます。

ruby

1$lessonOnclick = lessons.map { |lesson| lesson.at_css('a')[:onclick] }

投稿2019/08/01 01:10

maisumakun

総合スコア145121

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

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

re_refuse

2019/08/01 01:16

ありがとうございます。試してみたのですが、 rb:38:in `block in <main>': undefined method `[]' for nil:NilClass (NoMethodError) というエラーが発生してしまいました....
maisumakun

2019/08/01 01:20

元のコードでもループを回している割に、1回毎に変化するlessonを全く使っていなかったので、意図が取れない部分がありました(そのあたりからの調節が必要そうです)。
re_refuse

2019/08/01 01:25

調節したら思っていたことができました!ありがとうございます!
guest

0

エラーの直接の原因は、lessons.at_css('a')nilを返している(タグが見つかっていない)ことです。

見つかったとして、その先は、$lessonsOnclick[$i] << <<でエラーが出るかと思います。

Arrayの扱いを間違っていますので、まずは、基本的なRubyプログラムの書き方を学んだ方が良いです。
入門書の例題とか。
個人ブログの類いに載っているものは、善し悪しがあるので、悪い見本をまねちゃうと困りますが。

投稿2019/08/01 01:09

otn

総合スコア84423

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

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

re_refuse

2019/08/01 01:18

回答ありがとうございます。 lessons.each do |lesson| lessonsOnclick = lessons.at_css('a')[:onclick] puts lessonsOnclick end とかくと正しく動作します。 しかし、配列に格納しようとするとエラーが出てしまいます。...
otn

2019/08/01 01:28

lessons と lesson のタイプミス?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問