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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

2631閲覧

mechanizeでHTMLframeのsrc属性のファイルをダウンロードしたい

dlrowolleh

総合スコア120

Ruby

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2016/11/15 09:10

編集2017/01/21 07:05

###前提・実現したいこと→ファイルを取得して保存したい。
あるウェブサイトからファイルを取得したいと考えています。
ファイルは一時間ごとに更新されるため、ファイル名も年月日時間で変化します。
Rubyでファイルをダウンロードし、指定したディレクトリに保存させたいです。

mechanize.rb

をcronに登録し、時間になると実行して、ダウンロードさせたいと思っています。

###試したこと

ruby

1#download.rb 2# URLにアクセスするためのライブラリの読み込み 3require 'open-uri' 4 5# スクレイピング先のURL 6url = 'http://example.com/DataList.php?MstCode=01234567' 7# user_agentの設定 8user_agent = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36' 9charset = nil 10html = open(url, "User-Agent" => user_agent) do |f| 11 charset = f.charset # 文字種別を取得 12 f.read 13 end 14 15# 取得したhtmlを全て表示する 16 puts html 17 18

を実行しました。

<html> <head> <META http-equiv="Content-Type" content="text/html; charset=EUC-JP"> <title>文字化けしている</title> </head> <frameset rows="180,*" cols="*" frameBorder="0"> <frame name="Titke" src="DataListTitle.php?MstCode=01234567&Time=yyyymmddhhの形式" scrolling="no"> <frame name="Hyou" src="DataListHyou.php?MstCode=01234567&Time=yyyymmddhhの形式" scrolling="yes"> </frameset> <noframes></noframes> </html>

と表示されました。
保存したいファイルは、

DataListHyou.php?MstCode=01234567&Time=yyyymmddhhの形式

です。
保存したい場所は、

/home/(ユーザ名)/Desktop/ファイル

です。

また、文字化けにも対応したいです。
プログラムをどのように修正すればいいでしょうか。
何卒よろしくお願いします。

###補足情報(言語/FW/ツール等のバージョンなど)
Ubuntu15.10
Ruby2.2.4です。

#追記
ファイル名はそのままで保存したいです。
保存したい場所は

home/(ユーザ名)/Desktop/ファイル

です
Mechanize::File - Seesaa Wiki(ウィキ)を参考にしたのですが、うまくいきませんでした。

require "mechanize" agent = Mechanize.new agent.user_agent_alias = "Windows Chrome" url = "http://soramame.taiki.go.jp/DataList.php?MstCode=34204520" page = agent.get(url) page.root.xpath("//frame").each do |frame| if frame["name"] == "Hyou" frame_url = frame["src"] frame_page = agent.get(frame_url) "frame_page.body を 目的のファイルに書き込み" path = "/home/ユーザ名/Desktop/file " filename = path save_as(filename) end end puts page.body.force_encoding(page.encoding).encode("utf-8")

$ ruby mechanize.rb

と実行したところ

mechanize.rb.rb:15:in `block in <main>': undefined method `save_as' for main:Object (NoMethodError) from /home/(ユーザ名)/.rbenv/versions/2.2.4/lib/ruby/gems/2.2.0/gems/nokogiri-1.6.8.1/lib/nokogiri/xml/node_set.rb:187:in `block in each' from /home/(ユーザ名)/.rbenv/versions/2.2.4/lib/ruby/gems/2.2.0/gems/nokogiri-1.6.8.1/lib/nokogiri/xml/node_set.rb:186:in `upto' from /home/(ユーザ名)/.rbenv/versions/2.2.4/lib/ruby/gems/2.2.0/gems/nokogiri-1.6.8.1/lib/nokogiri/xml/node_set.rb:186:in `each' from mechanize.rb:8:in `<main>'

と表示されました。

また、

ruby

1 require "mechanize" 2 3 agent = Mechanize.new 4 5 agent.user_agent_alias = "Windows Chrome" 6 url = "http://example.com/DataList.php?MstCode=01234567" 7 page = agent.get(url) 8 9 page.root.xpath("//frame").each do |frame| 10 if frame["name"] == "Hyou" 11 frame_url = frame["src"] 12 frame_page = agent.get(frame_url) 13 "frame_page.body を 目的のファイルに書き込み" 14 end 15 16 p frame_page 17 puts frame_page 18 end 19

では、

$ ruby mechanize.rb

nil #<Mechanize::Page {url #<URI::HTTP http://example.com/DataList.php?MstCode=01234567>} {meta_refresh} {title "ホームページ"} {iframes} {frames} {links} {forms #<Mechanize::Form {name "Form1"} {method "GET"} {action ""} {fields [hidden:0x2ab59e31d368 type: hidden name: Err value: ]} {radiobuttons} {checkboxes} {file_uploads} {buttons}>}> #<Mechanize::Page:0x00556b3c27c700>

となります。

やりたいこと、させたい動作はイメージできますが、やり方等知識が圧倒的に不足しています。
知恵をお貸しいただけないでしょうか。
よろしくお願いしたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんな感じでしょうか。Mechanize gemを使います。

Ruby

1require "mechanize" 2agent = Mechanize.new 3agent.user_agent_alias = "Windows Chrome" 4 5url = "目的のURL" 6 7page = agent.get(url) 8page.root.xpath("//frame").each do |frame| 9 if frame["name"] == "Hyou" 10 frame_url = frame["src"] 11 frame_page = agent.get(frame_url) 12 open("/home/~~~~","w"){|f| f.write frame_page.body} # euc-jpのままで書く場合 13 open("/home/~~~~","w"){|f| f.write frame_page.body.force_encoding(frame_page.encoding).encode("utf-8")} # utf-8に変換して書く場合 14 end 15end 16 17puts page.body.force_encoding(page.encoding).encode("utf-8")

取得したHTMLファイルのエンコーディングをutf-8に変換して保存したい場合は、最終行を参考にしてください。

投稿2016/11/15 13:40

編集2016/11/17 12:20
otn

総合スコア84555

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

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

dlrowolleh

2016/11/16 10:22

ご回答いただきありがとうございます。 目的のURLの部分を http://example.com/DataList.php?MstCode=01234567 に直して 実行した結果、 端末に <html> <head> <META http-equiv="Content-Type" content="text/html; charset=EUC-JP"> <title>文字化けしている</title> </head> <frameset rows="180,*" cols="*" frameBorder="0"> <frame name="Titke" src="DataListTitle.php?MstCode=01234567&Time=yyyymmddhhの形式" scrolling="no"> <frame name="Hyou" src="DataListHyou.php?MstCode=01234567&Time=yyyymmddhhの形式" scrolling="yes"> </frameset> <noframes></noframes> </html> と表示され、 文字化けは解消されていました。 frame_page.body を 目的のファイルに書き込み とありますが、この部分に ダウンロードしたいファイル(DataListHyou.php?MstCode=01234567&Time=yyyymmddhhの形式) の保存先を指定(/home/(ユーザ名)/Desktop/2016/sample/html/1_イロハと記述)する ということでよろしいでしょうか? 何卒よろしくお願いします。
dlrowolleh

2016/11/16 10:23

書き間違いがあったので修正します。 <title>文字化けしている</title> と書きましたが、 <title>タイトル</title> ときちんと文字化けは解消されていました。
otn

2016/11/16 13:03

> 何卒よろしくお願いします。 ファイル名のロジックが不明だったので、コメント的に書いておきました。 ファイル名を決めてopenしてwriteしてください。
dlrowolleh

2016/11/17 12:02

ご回答いただきありがとうございます。 >ファイル名を決めてopenしてwriteしてください。 とのことですが、 http://seesaawiki.jp/ruby_mechanize/d/Mechanize%3A%3AFile#filename= を参考にしてみたのですが、うまくいきませんでした。 参考になるページ等ありましたらご教授いただけないでしょうか
otn

2016/11/17 12:22

ええと、自分でRubyプログラムを書く能力がゼロということでしょうか? 回答を書き直しておきました。 プログラムを書こうと思ったら、まずその言語に「入門」したほうがいいですよ。
dlrowolleh

2016/11/29 11:16

ご回答いただきましてありがとうございます。 回答を読ませて頂いておりましたが、なかなか理解できず、ご連絡が遅れて失礼しました。 プログラムはうまく動作しました。 初めは指定したディレクトリに目的のファイルをダウンロードして ため込んでいこう(名前を付けて保存のようなこと)と思っていたのですが、 今回のケースでは、目的のファイルのデータは文字列なので このやり方のように一つのファイルに 目的のファイルのデータを追記していったほうが、 ほしいデータだけを抜き出そうとする際等 管理が楽になりそうで良いと思いました。 大変勉強になりました。 ≫言語に「入門」したほうがいい やりたいことがイメージできても(目的があっても)手段を知らないと 何もできないことを身をもって感じました。 大変勉強になりました。 心からお礼申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問