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

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

ただいまの
回答率

87.50%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 781

score 2

前提・実現したいこと

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 "東京メトロ南北線「六本木一丁目」駅直結">]>,

該当のソースコード

# URLにアクセスするためのライブラリの読み込み
require 'open-uri'
# Nokogiriライブラリの読み込み
require 'nokogiri'

# スクレイピング先のURL
url = 'https://www.dip-net.co.jp/company/access'

charset = nil
html = URI.open(url) do |f|
  charset = f.charset # 文字種別を取得
  f.read # htmlを読み込んで変数htmlに渡す
end

# htmlをパース(解析)してオブジェクトを生成
doc = Nokogiri::HTML.parse(html, nil, charset)

table = {}
table["doc.css('th')"] = doc.css('td')

p 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]を使っています

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

書いてみました

require 'open-uri'
# Nokogiriライブラリの読み込み
require 'nokogiri'

# スクレイピング先のURL
url = 'https://www.dip-net.co.jp/company/access'

charset = nil
html = URI.open(url) do |f|
  charset = f.charset # 文字種別を取得
  f.read # htmlを読み込んで変数htmlに渡す
end

# htmlをパース(解析)してオブジェクトを生成
doc = Nokogiri::HTML.parse(html, nil, charset)

table = []
address_texts = doc.css('td').map(&:text)

address_texts.each_slice(4) do |office, postal_code, address, description|
  hash = {
    office:      office,
    postal_code: postal_code,
    address:     address,
    description: description
  }

  table << hash
end

pp table.first(3)
# =>
# [{:office=>"本社",
#   :postal_code=>"〒106-6231",
#   :address=>"東京都港区六本木3-2-1 六本木グランドタワー31F",
#   :description=>"東京メトロ南北線「六本木一丁目」駅直結"},
#  {:office=>"札幌オフィス",
#   :postal_code=>"〒060-0001",
#   :address=>"北海道札幌市中央区北1条西3-3 札幌MNビル12F",
#   :description=>"地下鉄南北線「札幌」駅地下鉄東西線「大通」駅"},
#  {:office=>"仙台オフィス",
#   :postal_code=>"〒980-0013",
#   :address=>"宮城県仙台市青葉区花京院1-1-10 あいおいニッセイ同和損保仙台ビル9F",
#   :description=>"JR「仙台」駅、「あおば通」駅地下鉄南北線「広瀬通」駅"}]

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/08/28 18:44

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

    キャンセル

  • 2020/08/28 19:05

    個人的には; Mechanize や Watir など、既存のライブラリに頼るのがもっとも簡単なゴール到達の方法だと思います

    ライブラリに頼らないというのは、1から10 まですべて自分自身の手で実装を求められることにつながるでしょうから...

    キャンセル

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

  • ただいまの回答率 87.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る