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

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

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

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

Ruby

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

Ruby on Rails

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

565閲覧

スクレイピングしたデータをeach文でテーブルタグに一覧表示させる方法を知りたいです。

Kiyobun510

総合スコア12

スクレイピング

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

Ruby

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

Ruby on Rails

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/06/16 04:20

現在横断検索ツールを開発中です。
Webに公開するものではなく個人的用途として使用しようと考えております。

##やりたいこと
①検索結果(ヤフオク)からデータを取得してインスタンス変数に格納
②格納したデータ一覧をテーブルタグに出力(タイトル、入札件数、価格)

##問題点
以下のようにコードを書いたが取得したデータが繰り返し表示されてしまいます。(実行結果画面参照)
まずはとりあえず動かしたいので汚いコードですがご容赦くださいませ。

Viewファイル

ruby

1<div class="uk-container uk-container-center uk-margin-top"> 2 <div class="uk-grid "> 3 <form class="uk-align-center uk-flex"> 4 <%= form_with url: root_path, local: true do |f| %> 5 <%= f.text_field :keyword, class: 'uk-input' %> 6 <%= f.submit "探す", class: 'uk-button uk-button-primary' %> 7 <% end %> 8 </form> 9 </div> 10 <% if @keyword.present?%> 11 <table class="uk-table uk-table-divider"> 12 <thead> 13 <tr> 14 <th class="uk-table-expand">タイトル</th> 15 <th class="uk-table-shrink">入札</th> 16 <th class="uk-width-small">価格</th> 17 </tr> 18 </thead> 19 <tbody> 20#以下の繰り返し処理がうまくできません。 21 <% @titles.each do |title| %> 22 <% @bids.each do |bid| %> 23 <% @prices.each do |price| %> 24 <tr> 25 <td><%= title.inner_text %></td> 26 <td><%= bid.inner_text %></td>   27 <td><%= price.inner_text %></td> 28 </tr> 29 <% end %> 30 <% end %> 31 <% end %> 32 </tbody> 33 </table> 34 <% end %> 35</div>

Controller

rury

1class TopController < ApplicationController 2 3 require 'mechanize' 4 5 def home 6 @keyword = URI.encode_www_form(p: params[:keyword]) 7 agent = Mechanize.new 8 escaped_url = "https://auctions.yahoo.co.jp/search/search?auccat=&tab_ex=commerce&ei=utf-8&aq=-1&oq=&sc_i=&fr=auc_top&#{@keyword}" 9 page = agent.get(escaped_url) 10 @titles = page.search('//*[@id="allContents"]/div[1]/div[2]/div[3]/div/div[2]/div[1]/div/ul/li/div[2]/h3/a') 11 @bids = page.search( '//*[@id="allContents"]/div[1]/div[2]/div[3]/div/div[2]/div/div/ul/li/div[2]/div[2]/div[1]/span[2]') 12 @prices = page.search('//*[@id="allContents"]/div[1]/div[2]/div[3]/div/div[2]/div/div/ul/li/div[2]/div[1]/span/span[2]') 13 end 14end 15

実行結果
実行結果画面
##試したこと
each文をひとつに絞って実行してみたところうまくいったのでやはり3重にしてeach文をつかいのがいけないのだと思います。
ハッシュをつくってキーを割り当て、そこからアクセスする方法など試みましたがうまくいきませんでした。

##質問点

  • テーブルに繰り返し表示されずにスクレイピングしたデータをviewに表示させるのはどうしたらいいでしょうか?
  • 今回のような実装をするにはいったんデータベースに保存してテーブルからデータを取り出す方法しかないのでしょうか?(この場合なら テーブル名.title,テーブル名.bid などとしてeach文を回せば表現できそうです。)

今回は個人的使用なのでデータベースまで用意するのは大掛かりすぎる気がしますので使わずに実装する方法を知りたいです。(使用頻度は低いので参照先への負荷はほとんどないと考えております。)

ご教授いただけますと幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

each で回すところは、以下のようになるのではないでしょうか?

ruby

1@titles.zip(@bids, @prices).each do |title, bid, price| 2 # 省略 3end

投稿2020/06/16 06:52

taichi730

総合スコア318

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

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

Kiyobun510

2020/06/16 07:22

ご回答ありがとうございます。 言われた通りに書き換えたらうまくいきました! zipメソッドは2つの配列ではなく3つ以上でもいけるんですね。 非常に勉強になりました。 丸2日ほどここで躓いていて進んでいなかったので本当に助かりました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問