専門家に聞いた!繰り返す痔の原因は!? >>

初めて質問します。よろしくお願いいたします。

Rubyのmechanizeを利用し、form内のダウンロードボタンを
クリックして、ファイルをダウンロードする処理を記載したい
のですが、ファイルをローカルマシンに保存する方法がわかりません。
ご存知の方がいらっしゃいましたら、ご教授頂ければと思います。

よろしくお願いいたします。


↓↓↓以下、コードです。↓↓↓

require 'rubygems'
require 'mechanize'
require 'kconv'

#初期設定
fname = 'test.csv'
csv_file = File.open(fname,'w')

# インスタンス生成
agent = WWW::Mechanize.new

# User-Agentの設定
agent.user_agent_alias = 'Windows IE 6'

# ページ取得
site_login = agent.get('https://***.php')

# フォームを探す
search_form = site_login.forms.with.name('login').first

# テキストボックスにデータを入力
search_form['f[EMAIL]'] = 'userid'
search_form['f[PASSWORD]'] = 'password'

# フォームのsubmitボタンを押す
site_top = agent.submit(search_form)

# リンクをたどる
site_top_link = site_top.links.text('ダウンロード')
site_next = agent.get(site_top_link.href)

# フォームを探す
search_next_form = site_next.forms.with.name('myform').first


# データを入力?
search_next_form['from'] = '1'
search_next_form['from_date[from_Year]'] = '2007'
search_next_form['from_date[from_Month]'] = '03'
search_next_form['from_date[from_Day]'] = '02'
search_next_form['to'] = '1'

#↓↓ここをどう書けばよいかで悩んでいます。。。とりあえずこのままでは期待したデータは取れておりません。
## フォームのsubmit(ダウンロード)ボタンを押し、取得したデータをファイルに保存
#csv_file.puts agent.submit(search_next_form)
#↑↑ここをどう書けばよいかで悩んでいます。。。とりあえずこのままでは期待したデータは取れておりません。

csv_file.close

このQ&Aに関連する最新のQ&A

A 回答 (1件)

csv_file.puts agent.submit(search_next_form).body


でどう?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
#レス遅くなってしまい申し訳ありません!

上記のように修正したところ、データを取得できました!
・・・が、この土日にデータダウンロードの仕様に変更が入ったらしく、
GPGにより暗号化されたファイルがダウンロードされるように変更されていました。
このダウンロードしたデータはGPGの複合化に失敗してしまいます。

putsでの出力処理がいけないのかと思い、ご教授頂いた処理を下記のように書き直してみたところ、"300バイトまでは復元し、あとは失敗する"という全く手に負えない状態になってしまいました。

もしファイル出力処理で中止しなければならない点等ご存知でしたら、ご教授いただけないでしょうか?

#修正した出力部分
csv_file.write(agent.submit(search_next_form).body)

お礼日時:2007/03/14 12:47

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qエクセル関数で日付かどうかの確認?

ワークシート関数でセル内が日付かどうか調べるものはないでしょうか?
VBAのIsDateなら存じておりますが。

Aベストアンサー

日付を表すデータは、セルの値としては、単なる数値なのですが、どういう種類のセルの書式が設定されているかを調べることはできます。
調べたいセルがA1だとして
=cell("format",A1)

"D1"になれば概ね日付だと判別できます。
時刻を含めたものにする場合は、
Dで始まることをチェックすればいいかも。
詳しくは、CELL関数のヘルプを参照してください。

Q【file_exists】ファイルが存在するのに、存在しないとなります

いつもお世話になっております。
■環境■
PHP5 Windows
■状況■
フォルダ内にtextファイルが20~45個入っております(個数は状況によって変わります)。
■目的■
フォルダのtextファイルの中身を参照し、各textファイルに必ず含まれる数字を取り出す。でございます。

■方法■
(1)フォルダにあるファイル名を取りだす
(2)fopenで読み込み(r)で全部を見、数字を別ファイルに書き込む

と考えたのですが、(1)で.、..というよくわからないファイルも一緒に出てきてしまったので、file_existsでファイルが存在するか確認してから(2)に移ろうとお思いました。
が、ファイル名は全部ないといわれてしまうのです。
しかしfile_exists($filename)の$filenameを表示させ、ブラウザにこぴぺするとtextデータは出てきます。

以下プログラムの一部です
※$cは(1)で得たフォルダ内にあるファイル名をループでまわしている値です

for($b=0;$b<$a;$b++){
 $filename="C:/Inetpub/wwwroot/php/kore/1/".$c;
if (file_exists($filename)) {
print "あるよ<BR>";
} else {
print "ないよ<BR>";
}
}

結果は(一部です)
C:/Inetpub/wwwroot/php/kore/1/.text⇒ないよ
C:/Inetpub/wwwroot/php/kore/1/..text⇒ないよ
C:/Inetpub/wwwroot/php/kore/1/0155442A5.txt⇒ないよ
C:/Inetpub/wwwroot/php/kore/1/01762602A.txt⇒ないよ
です。
上記の
C:/Inetpub/wwwroot/php/kore/1/01762602A.txt
C:/Inetpub/wwwroot/php/kore/1/0155442A5.txt
は確実に存在しております。

どこがおかしいのか、ご教授いただければ幸いです
よろしくお願いいたします

いつもお世話になっております。
■環境■
PHP5 Windows
■状況■
フォルダ内にtextファイルが20~45個入っております(個数は状況によって変わります)。
■目的■
フォルダのtextファイルの中身を参照し、各textファイルに必ず含まれる数字を取り出す。でございます。

■方法■
(1)フォルダにあるファイル名を取りだす
(2)fopenで読み込み(r)で全部を見、数字を別ファイルに書き込む

と考えたのですが、(1)で.、..というよくわからないファイルも一緒に出てきてしまったので、file_exists...続きを読む

Aベストアンサー

直接の回答ではありませんが、「.」や「..」という名前が出て来るということは、scandirやopendirしてreaddirでファイル名の一覧を取得しているということですよね。

一覧すべてを取得するのではなく、目的とするファイルのみ一覧で取得できるglobを使う方が便利ではないかと思います。たとえば glob("*.txt") を実行すれば、拡張子がtxtのファイルの一覧を返してくれます。

file_existsがtrueで返らない理由については、他の方もおっしゃっているとおり、まず渡しているファイル名が本当に思っているものなのかどうかを確認してみた方が良いと思います。ありそうなのは、$c にディレクトリ名の一部が入っている、とか。

QRubyのHTMLパーサーで複数のタグを抽出したい

現在、Rubyを用いて
あるWebページから特定のタグの要素を抽出して
テキストデータに出力したいと思い、プログラムを書いているのですが、
途中で行き詰ってしまいました。
ちなみにHpricotやNokogiriといったHTMLパーサーを試してみました。
パーサーを使うのは初めてです。

例えば以下のようにHTML文書に抽出したい部分がDIVタグとPタグに囲まれていた場合、
=====================================
・・・
<div class="content">
<div class="header">不要部分</div>
<div class="title">抽出したい文字列1</div>
<div class="subtitle">抽出したい文字列2</div>
<div class="subtitle">抽出したい文字列3</div>
<p class="paragraph">抽出したい文字列4</p>
<p class="paragraph">抽出したい文字列5</p>
<div class="comment">抽出したい文字列6</div>
<div class="footer">不要部分</div>
</div>
・・・
=====================================

このHTMLからまずは
抽出したい文字列1
抽出したい文字列2
抽出したい文字列3
抽出したい文字列4
抽出したい文字列5
抽出したい文字列6
といった出力が得たいのです。

プログラムも書いてみました。

=====================================
#ドキュメント全体を取得(dataにはHTMLの文字列が入っている)
html = Hpricot(data)
#内容部分(contentクラスのdiv)を取得(CSSセレクタで記述)
content = html/"div.content"

=====================================

ここまでは良いのですが、
そのあと、div要素を取り出すだけであれば
headerクラスと、footerクラスを抽出しないように

=====================================
(content/"div:not(.header):not(.footer)").each{ |line|
puts line.inner_html
}
=====================================

とすることで、

抽出したい文字列1
抽出したい文字列2
抽出したい文字列3
抽出したい文字列6

が得られますが、pタグをカンマでdivの前に追加して

=====================================
(content/"p,div:not(.header):not(.footer)").each{ |line|
puts line.inner_html
}
=====================================

のようにすると、

抽出したい文字列4
抽出したい文字列5
抽出したい文字列1
抽出したい文字列2
抽出したい文字列3
抽出したい文字列6

のように出力されます。

同様にdivの後にpを追加し

=====================================
(content/"div:not(.header):not(.footer),p").each{ |line|
puts line.inner_text
}
=====================================

のようにすると


抽出したい文字列1
抽出したい文字列2
抽出したい文字列3
抽出したい文字列6
抽出したい文字列4
抽出したい文字列5

のようになってしまいます。
つまり、複数のタグを指定すると、指定した順序で抽出されるようです。
代わりに子供すべてを列挙するchildのようなものがあるかと、調べてみたのですが、
どうやらそのような書き方はないようです。

複数のタグを含む場合にはHTMLパーサーでは解析できないのでしょうか。
パーサーは抽出時に順番を保証はしてくれないのでしょうか。

あきらめて、正規表現で抽出しようと思いましたが、
=====================================
<div class="comment">
<div class="comment_header">ごちゃごちゃ</div>
<div class="comment_body">抽出したい要素6</div>
</div>
=====================================
などDIVが入れ子となっている場合に、
非常にややこしく感じたので
お手上げ状態です。

どのように、解決できるでしょうか。
よろしくお願いします。

現在、Rubyを用いて
あるWebページから特定のタグの要素を抽出して
テキストデータに出力したいと思い、プログラムを書いているのですが、
途中で行き詰ってしまいました。
ちなみにHpricotやNokogiriといったHTMLパーサーを試してみました。
パーサーを使うのは初めてです。

例えば以下のようにHTML文書に抽出したい部分がDIVタグとPタグに囲まれていた場合、
=====================================
・・・
<div class="content">
<div class="header">不要部分</div>
<div class="title">抽出したい文字列...続きを読む

Aベストアンサー

CSSであまり複雑な指定をしたこと無いのですが、おそらくXPathのほうが細かい指定が出来ます。
Nokogiriでしか確認していませんが、おそらくHpricotでもXPath指定が出来ると思います。

content / "./*[@class!='header' and @class!='footer']"

./* が直下の任意のノードで、[ ] 内がその選択条件です。
あるいはまとめて、htmlから直接、

html / "//div[@class='content']/*[@class!='header' and @class!='footer']"

任意のノードでなく、div と p だけに限るなら、

content / "./*[((name()='p')or(name()='div')) and @class!='header' and @class!='footer']"


人気Q&Aランキング