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

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

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

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

Ruby

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

ハッシュ

ハッシュは、高速にデータ検索を行うアルゴリズムのことです。

配列

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

Q&A

解決済

1回答

2117閲覧

Rubyでスクレイピングした値をハッシュに保存し配列にする

urayam

総合スコア2

スクレイピング

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

Ruby

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

ハッシュ

ハッシュは、高速にデータ検索を行うアルゴリズムのことです。

配列

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

0グッド

0クリップ

投稿2020/08/28 00:19

前提・実現したいこと

Rubyで「nokogiri」ライブラリを使ってwebページからスクレイピングした値をハッシュに保存し配列にしたいのですがスクレイピングした値をハッシュに変換する事ができません。

見本はこのようになっています
{"拠点名"=>"本社",
"郵便番号"=>"〒106-6231",
"住所"=>"東京都港区六本木3-2-1 六本木グランドタワー31F",
"アクセス"=>"東京メトロ南北線「六本木一丁目」駅直結"}

発生している問題・エラーメッセージ

{"doc.css('th')"=> [#<Nokogiri::XML::Element:0x21c name="td" children=[#<Nokogiri::XML::Text:0x208 "本社">]>, #<Nokogiri::XML::Element:0x244 name="td" children=[#<Nokogiri::XML::Text:0x230 "〒106-6231">]>, #<Nokogiri::XML::Element:0x26c name="td" children=[#<Nokogiri::XML::Text:0x258 "東京都港区六本木3-2-1 六本木グランドタワー31F">]>, #<Nokogiri::XML::Element:0x294 name="td" children=[#<Nokogiri::XML::Text:0x280 "東京メトロ南北線「六本木一丁目」駅直結">]>,

該当のソースコード

Ruby

1# URLにアクセスするためのライブラリの読み込み 2require 'open-uri' 3# Nokogiriライブラリの読み込み 4require 'nokogiri' 5 6# スクレイピング先のURL 7url = 'https://www.dip-net.co.jp/company/access' 8 9charset = nil 10html = URI.open(url) do |f| 11 charset = f.charset # 文字種別を取得 12 f.read # htmlを読み込んで変数htmlに渡す 13end 14 15# htmlをパース(解析)してオブジェクトを生成 16doc = Nokogiri::HTML.parse(html, nil, charset) 17 18table = {} 19table["doc.css('th')"] = doc.css('td') 20 21p table

試したこと

指定しているcssのコードを入れ替える

調べたURL
https://qiita.com/s-yank/items/73e6a2b08afd81ad4f32
https://www.javadrive.jp/ruby/hash/index5.html

補足情報(FW/ツールのバージョンなど)

Ruby ver 2.7.1
ライブラリは[nokogiri]を使っています

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

書いてみました

ruby#

1require 'open-uri' 2# Nokogiriライブラリの読み込み 3require 'nokogiri' 4 5# スクレイピング先のURL 6url = 'https://www.dip-net.co.jp/company/access' 7 8charset = nil 9html = URI.open(url) do |f| 10 charset = f.charset # 文字種別を取得 11 f.read # htmlを読み込んで変数htmlに渡す 12end 13 14# htmlをパース(解析)してオブジェクトを生成 15doc = Nokogiri::HTML.parse(html, nil, charset) 16 17table = [] 18address_texts = doc.css('td').map(&:text) 19 20address_texts.each_slice(4) do |office, postal_code, address, description| 21 hash = { 22 office: office, 23 postal_code: postal_code, 24 address: address, 25 description: description 26 } 27 28 table << hash 29end 30 31pp table.first(3) 32# => 33# [{:office=>"本社", 34# :postal_code=>"〒106-6231", 35# :address=>"東京都港区六本木3-2-1 六本木グランドタワー31F", 36# :description=>"東京メトロ南北線「六本木一丁目」駅直結"}, 37# {:office=>"札幌オフィス", 38# :postal_code=>"〒060-0001", 39# :address=>"北海道札幌市中央区北1条西3-3 札幌MNビル12F", 40# :description=>"地下鉄南北線「札幌」駅地下鉄東西線「大通」駅"}, 41# {:office=>"仙台オフィス", 42# :postal_code=>"〒980-0013", 43# :address=>"宮城県仙台市青葉区花京院1-1-10 あいおいニッセイ同和損保仙台ビル9F", 44# :description=>"JR「仙台」駅、「あおば通」駅地下鉄南北線「広瀬通」駅"}] 45

なにか参考になれば幸いです

投稿2020/08/28 01:09

gouf

総合スコア2321

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

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

urayam

2020/08/28 09:44

ご丁寧に有り難うございます。とても分かりやすいコードですぐに理解できました。 少し興味程度の質問なのですがrubyで追加のgem(nokogitiなど)なしでスクレイピングをする事って可能ですか?
gouf

2020/08/28 10:05

個人的には; Mechanize や Watir など、既存のライブラリに頼るのがもっとも簡単なゴール到達の方法だと思います ライブラリに頼らないというのは、1から10 まですべて自分自身の手で実装を求められることにつながるでしょうから...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問