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

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

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

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

Q&A

解決済

1回答

1290閲覧

【Ruby】No Method Errorの原因が分からない

Komama

総合スコア28

Ruby

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

0グッド

1クリップ

投稿2019/01/05 00:40

編集2019/01/05 01:50

■分からないこと

下記コードのNo Method Errorの原因が分かりません。
エラーメッセージは「rb:14:in block in get_data': undefined method text' for ["class", "ts-h-company-sentence"]:Array (NoMethodError)」と表示されます。

textメソッドは2ヶ所で使っていますが後半の
【"//div[@class='ts-h-company-sentence']"】だけエラーになります。
添付画像のようにbyebugを使ってターミナル上で試した時はテキストを取得でき、実行するとエラーになってしまいます。
イメージ説明

原因を教えていただけると助かります。

よろしくお願いいたします。

■該当のソースコード

ruby

1require 'open-uri' 2require 'nokogiri' 3require 'csv' 4require 'byebug' 5require 'kconv' 6 7def get_data(uri, data) 8 companies = data[0] 9 parameters = data[1] 10 html = open(uri).read 11 documents = Nokogiri::HTML(html.toutf8, nil, 'utf-8') 12 documents.xpath("//h1[@class='ts-h-company-mainTitle']").each {|c| companies << c.text} 13 documents.xpath("//div[@class='ts-h-company-sentence']")[1].each {|p| parameters << p.text.strip.gsub(/(\r)/, " ")} 14 return [companies, parameters] 15end

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

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

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

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

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

guest

回答1

0

ベストアンサー

ruby

1documents.xpath("//div[@class='ts-h-company-sentence']")[1]

上記の要素に text メソッドが適用できないからだと思います。

投稿2019/01/05 01:11

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Komama

2019/01/05 01:15

ご回答ありがとうございます! その場合、テキスト内容を取得するにはどのメソッドを使えばよろしいでしょうか…?
退会済みユーザー

退会済みユーザー

2019/01/05 01:18

メソッドが適用できないということから、"//div[@class='ts-h-company-sentence']" にテキストが含まれていないということかと思います。
Komama

2019/01/05 01:39

何度も申し訳ないですが、byebugを使ってターミナル上で試してみるとテキスト情報が取得出来ていて、ファイルを実行するとエラーになってしまうんです。。。
退会済みユーザー

退会済みユーザー

2019/01/05 01:41

「byebugを使ってターミナル上で試してみるとテキスト情報が取得出来ていて」の部分を具体的に示していただければ解決が早いと思います。
Komama

2019/01/05 01:51

ご指摘ありがとうございます! 内容を修正致しました。
退会済みユーザー

退会済みユーザー

2019/01/05 01:52

拝見しました。 コード上ではなぜ each メソッドを使っているのでしょうか。
Komama

2019/01/05 01:57

parametersに格納して、その後csvにするためです。 これしか方法を知らないのでいつもこうやってました。。。
退会済みユーザー

退会済みユーザー

2019/01/05 02:01 編集

eachを使う必要がないならば、以下でどうですか。 以下の行を削除する(置き換えるため)。 documents.xpath("//div[@class='ts-h-company-sentence']")[1].each {|p| parameters << p.text.strip.gsub(/(\r)/, " ")} 削除した行を以下の行に置き換える。 parameters << documents.xpath("//div[@class='ts-h-company-sentence']")[1].text.strip.gsub(/(\r)/, " ")
Komama

2019/01/05 02:02

出来ました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問