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

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

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

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

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Ruby

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

914閲覧

Ruby 同じ配列の中の2つの要素をCSVで2列で出力したい

TUTINO

総合スコア5

スクレイピング

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

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Ruby

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/08/14 15:59

同じ配列の中の2つの要素をCSVで2列に出力したいです。

Nokogiriでスクレイピングして、searchで2つの要素を複数取得しましたが、
同じ配列に入っているので、下記コードで出力すると
CSVとして、1列縦に、要素テキスト名.Product__titleLink が複数続き、
その下に、要素テキスト名.Product__priceValue が複数続いてしまいます。
CSVではこの2つの要素を横並びにしたいです。
色々WEBで探しましたが、解決策が見つかりませんでした。
お手数かけますが、助けて頂けると幸いです。

### 該当のソースコード doc = Nokogiri::HTML.parse(html, nil, charset) titles = doc.search('.Product__titleLink','.Product__priceValue').map{ |node| node.inner_text } CSV.open("sample.csv", "w") do |sample| sample << ["タイトル"] titles.each do |title| sample << [title] end end ```Ruby

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

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

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

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

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

guest

回答2

0

ベストアンサー

「私ならこう書く」ですが、異なるものを敢えて同じ配列に混ぜる意味がよく分からない。片方しか存在しないようなものがあり、単純に順にペアに出来ないとかでしょうか?そういうのは無い前提です。

Ruby

1titles = doc.search('.Product__titleLink').map(&:inner_text) 2prices = doc.search('.Product__priceValue').map(&:inner_text) 3 4CSV.open("sample.csv", "w") do |sample| 5 sample << ["タイトル","価格"] 6 titles.zip(prices).each do |list| 7 sample << list 8 end 9end

投稿2021/08/15 01:56

otn

総合スコア84806

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

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

TUTINO

2021/08/15 02:14

適切にご指導頂き、本当にありがとうございました。 そもそも配列の取得方法がまずかったのですね。 とても勉強になりました。
guest

0

Enumerable#each_sliceは使えますか?

ruby

1titles = doc.search('.Product__titleLink,.Product__priceValue').map{ |node| node.inner_text } 2#略 3titles.each_slice(2) do |(title, price)| 4 sample << [title, price] 5end

投稿2021/08/15 00:41

編集2021/08/15 01:06
asm

総合スコア15147

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

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

TUTINO

2021/08/15 01:25

早速回答頂き、本当にありがとうございます。 each_sliceを行うと下記並びで出力されました。 title,title title,title price,price price,price これはこれで凄く感動したのですが、 title,price title,price で出力できると助かります。 私の説明不足で申し訳ございません。
TUTINO

2021/08/15 02:19

この度は私の説明不足でご迷惑をおかけしました。 少し前に他の方から回答を頂きましたので、 またの機会にアドバイス頂けると助かります。 お忙しい中、ご指導頂き、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問