現在横断検索ツールを開発中です。
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文を回せば表現できそうです。)
今回は個人的使用なのでデータベースまで用意するのは大掛かりすぎる気がしますので使わずに実装する方法を知りたいです。(使用頻度は低いので参照先への負荷はほとんどないと考えております。)
ご教授いただけますと幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/16 07:22