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

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

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

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

Ruby

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

Q&A

解決済

1回答

704閲覧

スクレイピングで特定の要素を取得したい

taba.3011

総合スコア12

スクレイピング

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

Ruby

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

0グッド

0クリップ

投稿2021/01/11 09:48

編集2021/01/11 11:00

前提

mechanizeを用いて株の情報をスクレイピングしたいと思っています。

実現したいこと

<thead>タグは取得しない <tbody>タグの5、6、7日分の値を取得したい

しかし現段階では5日の<tbody>タグの値しか取得できない

取得したいページ

html

1<table class="stock_table stock_data_table"> 2 <thead> 3 <tr> 4 <th>日付</th> 5 <th>始値</th> 6 <th>高値</th> 7 <th>安値</th> 8 <th>終値</th> 9 <th>出来高</th> 10 <th>終値調整</th> 11 </tr> 12 </thead>         13 <tbody>           #5日のデータ 14 <tr> 15 <td>2009-01-05</td> 16 <td>1180</td> 17 <td>1180</td> 18 <td>1119</td> 19 <td>1135</td> 20 <td>2952000</td> 21 <td>1135</td> 22 </tr> 23 </tbody>  24 <tbody>             #6日のデータ 25 <tr> 26 <td>2009-01-06</td> 27 <td>1180</td> 28 <td>1180</td> 29 <td>1119</td> 30 <td>1135</td> 31 <td>2952000</td> 32 <td>1135</td> 33 </tr>       34 </tbody>  35 <tbody> #7日のデータ 36 <tr> 37 <td>2009-01-07</td> 38 <td>1180</td> 39 <td>1180</td> 40 <td>1119</td> 41 <td>1135</td> 42 <td>2952000</td> 43 <td>1135</td> 44 </tr>         45 </tbody>                 

コード

ruby

1require 'mechanize' 2 3class Scraping 4 stock = Mechanize.new 5 6 page = stock.get('https://kabuoji3.com/stock/7752/2009/') 7 8 table = page.search("//table[@class='stock_table stock_data_table']/tbody") 9 10 table.each do |t| 11 puts t.inner_text 12 end 13 14end

この問題がずっと解けないでいるスクレイピング初心者ですが、どなたか回答をいただけたら幸いです。

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

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

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

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

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

otn

2021/01/11 10:35 編集

tbodyの対応が取れていないような壊れたHTMLのページなのでしょうか? > しかし現段階では最初の<tbody>タグしか取得できません。 tbodyは1つしか書かれてませんが?
taba.3011

2021/01/11 11:11

@otn様、指摘ありがとうございます。 <tbody>それぞれに各日付の値が入っており、5,6,7日分の<tbody>を取得したかったけれど、5日分の<tbody>しか取得できないという状況です。
guest

回答1

0

ベストアンサー

ページを見てみましたが、

tbodyの対応が取れていないような壊れたHTMLのページなのでしょうか?

のようですね。

案1:得たHTMLを書き換えて、正しいHTMLにする
案2:tbodyを使わない

案2だと、

Ruby

1table = page.search("//table[@class='stock_table stock_data_table']//tr")[1..-1]

投稿2021/01/11 11:32

otn

総合スコア84804

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

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

taba.3011

2021/01/11 12:03

ご回答ありがとうございます! 参考にさせていただいたところ、無事に値の取得ができました。
otn

2021/01/11 12:55

コメント書き忘れましたが、tr を全部取るとヘッダー部分から取れてしまうので、 その先頭要素を除くために[1..-1]を付けてます。
taba.3011

2021/01/11 13:43

補足ありがとうございます。 使い方について調べても分からないのですが、もし可能であれば、「trの前にスラッシュを2つ付ける意味」、「[1..-1]のドットを2つ付ける意味」についてご教授いただけないでしょうか?
otn

2021/01/11 13:53

table[~~]/tr だと、tableの直下のtrだけなので、tabkeの直下のtbodyの直下のtrが対象になりません。 table[~~]//tr で、tableの全子孫のtrの意味になります。 1..-1 はレンジで、Rubyの基本の1つなので、これは知らないのであれば、Rubyの入門書を読んでその周辺まるごと学んでください。 あるいはArrayの添え字の基本の1つでもあります。
taba.3011

2021/01/11 14:16

わかりやすい説明ありがとうございます。 基本について質問してしまい恐縮です。 学び直そうと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問