[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/09 22:42 / Filesize : 246 KB / Number-of Response : 911
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Ruby 初心者スレッド Part 24



1 名前: 【大吉】 mailto:sage [2009/01/01(木) 13:13:22 ]
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

   【Ruby1.9 は不安定な開発版であり初心者には全く向きません】
   【最新安定版の Ruby1.8.7 の使用をお勧めします】
    ※1.8.7 は1.8 と 1.9 の橋渡しをするためのリリースです。
      1.9 の新機能の一部が利用可能なので初学者にお勧めです。
    ※ただし十分安定しているとは言えないので
      プロダクション環境での利用にはお勧めしません。

関連スレやURLは>>2-8あたりを見てください。Ruby on Railsの質問はRailsスレへ。

■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
 ・モジュール名やエラーメッセージでググる
 ・マニュアルで引っかかったクラスの記述を探す www.ruby-lang.org/ja/man/
 ・FAQを一応読む www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・エラーメッセージ(自力で訳さずなるべくそのままで)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。

175 名前:初心者 mailto:sage [2009/01/07(水) 22:39:50 ]
Net::HTTPなるモジュールがぐぐれたので使ってみようと思います。


176 名前:初心者 mailto:sage [2009/01/07(水) 22:43:01 ]
Net::HTTP.version_1_2 # おまじない
Net::HTTP.start('www.yahoo.co.jp', 80) {|http|
response = http.get('/index.html')
puts response.body
}

これでなんかアクセスできたっぽいのですが、
構文が意味不明です。
解説きぼんぬ

177 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 22:43:53 ]
open-uri使えば。

178 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 22:46:20 ]
Mechanizeというのがある。
Hpricotとopen-uriで満足したから使ったことないんだけれど。

179 名前:デフォルトの名無しさん [2009/01/07(水) 22:46:37 ]
ほんとうにC++のプロなの?

180 名前:初心者 mailto:sage [2009/01/07(水) 22:49:30 ]
なるほど、open-uriもつ変えそうですね
ありがとうです

181 名前:初心者 mailto:sage [2009/01/07(水) 22:52:52 ]
ブロック付きメソッド呼び出しという構文があるんですね
新しい言語は刺激的です

182 名前:デフォルトの名無しさん [2009/01/07(水) 22:54:46 ]
そっからかよw

183 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 22:55:20 ]
>>178
ちゃんとリンクになってるならMechanizeも楽だけどね。
Mechanizeのメソッドを上書きして、
取得してきたHTML書き換えてリンクにしてからパースさせるという手もできそう。



184 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 22:58:41 ]
http://で始まって.jpgとか.pngとか.gifとかで終わる文字列探すとかでも
それなりになんとかなりそうなならなそうな

185 名前:初心者 mailto:sage [2009/01/07(水) 23:07:24 ]
open-uriではStringIOオブジェクトが渡されて・・・
StringIOの中味をダンプ松本したいのですが
printメソッド読んでもなにも表示されないです

186 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 23:08:36 ]
IOはとりあえずreadだ

187 名前:初心者 mailto:sage [2009/01/07(水) 23:13:56 ]
>>186
ありがとうございます。
print f.read
でいけました。



188 名前:初心者 mailto:sage [2009/01/07(水) 23:16:57 ]
処々でみかける p って組み込み関数なんですね。
これはちょっと受け入れがたい衝撃でした。
タイプ量減らすためでしょうかね


189 名前:初心者 mailto:sage [2009/01/07(水) 23:25:10 ]
ハ・・・ッシュ??

190 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 23:25:44 ]
p はデバッグ用の出力関数。
タイプ量を減らすためなのは確実。

191 名前:デフォルトの名無しさん [2009/01/07(水) 23:31:51 ]
>>189
連想配列のこと。と言えばいいのかな。

192 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 23:33:18 ]
まとめサイトのurl渡すと画像DLしてzipに固めるってのを以前作ったなぁ

193 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 23:33:58 ]
根拠がないくせに「確実」だってさwwwwww
開発者がpって打ったとき冷蔵庫にザッハトルテがあることを思い出して食べてたら
うっかり忘れちゃってたのが今でもそのままになってるに決まってるんだぜ



194 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 23:35:29 ]
だから外部プログラムのwget使え
wgetを使ったこともないような人間はそもそもまともなものを作れない
Webブラウザを使ったことのない人間がWebブラウザを作れるか?

195 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 23:37:23 ]
最初のwebブラウザを作った人はどうしたんだ

196 名前:初心者 mailto:sage [2009/01/07(水) 23:38:12 ]
std::map の特殊版みたいなもんですね > ハッシュ

metaにレスポンスヘッダが格納されているはず・・・
でもSet-Cookieが見つからない・・・

197 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 23:40:31 ]
>>195
通信に必要な仕様を読んだ

他人に聞かないと作れないってことは、仕様の知識がないということ
仕様の知識がないのなら、他人が作ったお着せのプログラムを使い倒すことから始めるべき
それで不満が出てきてから勉強を始めても遅くはない

198 名前:初心者 mailto:sage [2009/01/07(水) 23:42:12 ]
f.meta.each_key { |key| p key }
でみたら"set-cookie"で入ってました。。。

ブロックつきなんたら構文、便利ですね

199 名前:デフォルトの名無しさん [2009/01/07(水) 23:42:36 ]
>>193
根拠がないくせに

「決まってるんだぜ」

          ____
        /_ノ  ヽ、_\
 ミ ミ ミ  o゚((●)) ((●))゚o      ミ ミ ミ    <だっておwww
/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\   /⌒)⌒)⌒)
| / / /     |r┬-|    | (⌒)/ / / //
| :::::::::::(⌒)    | |  |   /  ゝ  :::::::::::/
|     ノ     | |  |   \  /  )  /
ヽ    /     `ー'´      ヽ /    /
 |    |   l||l 从人 l||l      l||l 从人 l||l
 ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))

200 名前:デフォルトの名無しさん [2009/01/07(水) 23:48:16 ]
>最初のwebブラウザを作った人
だれだっけ
事務クラーク?

201 名前:初心者 mailto:sage [2009/01/07(水) 23:48:55 ]
グローバルスコープで変数宣言したいのですが、
cookie
だけだとundefined local variableとか怒られて
cookie = ''
だと通ったのですが、Why?

202 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 23:49:30 ]
アラン・ケイ

203 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 23:53:54 ]
>>201
ruby-lang.org/ja/man/



204 名前:デフォルトの名無しさん [2009/01/07(水) 23:54:16 ]
>>200
ティム・バーナーズ・リー氏だと思う。

205 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 23:55:51 ]
undefined local variableすら読めないのにC++ではプロって
あまりに恥ずかしい
仕事して金もらってれば一応プロではあるが、実力はアマチュア未満じゃないか

206 名前:204 [2009/01/07(水) 23:56:13 ]
いや、彼はHTTP、URL、HTMLの設計だけかもしれない。。。

207 名前:204 [2009/01/07(水) 23:58:16 ]
いや、あってた。
# 1990年11月 - ティム・バーナーズ=リーが最初のWebサーバとウェブブラウザを試作する。
# 1991年2月 - バーナーズ=リーが開発したウェブブラウザであるWorldWideWebをインターネットに公開する。
ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A7%E3%83%96%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6#.E6.AD.B4.E5.8F.B2

>>205
釣りじゃねーの?

208 名前:初心者 mailto:sage [2009/01/08(木) 00:11:06 ]
>>205
Rubyでは未初期化での変数定義は許されないんですか?
C/C++では許されるので、そのあたりに疑問を抱いただけですが・・・
ちなみに私の書いたプログラムのユーザは全世界で数千万単位です。

209 名前:初心者 mailto:sage [2009/01/08(木) 00:19:47 ]
Cookie偽装でむふふ画像のありかをしめすhtmlの取得まで
たどりつけました。
みなさまのご指導のおかげです。
画像取得&Zip化は明日にします。
どうもありがとうございました。

210 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 00:29:39 ]
>>197
>他人に聞かないと作れないってことは、仕様の知識がないということ
>仕様の知識がないのなら、他人が作ったお着せのプログラムを使い倒すことから始めるべき
>それで不満が出てきてから勉強を始めても遅くはない

仕様の知識がないのはRubyについてで、
wgetとかHTTPの仕様には詳しそうじゃん。
wgetがRubyで実装されてるっていうなら別だが。
てかお前の読解力がなさすぎ

211 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 00:39:45 ]
他の言語経験があるなら、仕様については人に聞かなくても
ドキュメント読めばいいだけの話じゃん。

仕様を理解するのが面倒だから人に聞いたのかも知れないけど。

212 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 01:20:21 ]
wgetよりcurlを使ってください

213 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 01:26:49 ]
そうそう連番jpgを落すならcurlに限る



214 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 02:33:53 ]
Hpricotでsearchした要素から再度searchするにはどうすればいいでしょうか?

class Blog
def chk_aaa(site)
content = Array.new
site.search("div.AAA").each { |entry|
content << entry.to_s.toutf8
}
return content
end
end
site = Hpricot(open("hogehoge.net").read)
aaa =Blog.new.chk_aaa(site)

上ので言えばdiv.AAAの中にdiv.BBBという要素があるときに
aaaからsearchするにはどうすればいいでしょうか?

215 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 02:37:07 ]
>>214
entry.search

216 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 02:38:23 ]
質問の意図がわからなくなってきた。こっちかも?
site.search("div.AAA").search("div.BBB").each


217 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 02:48:00 ]
>>215-216

すいません。
やりたいのはaaa.search("div.BBB")なのです。
しかし、aaa.searchするにはaaaはArrayなので
それをまたHpricotに投げないといけないのかなとおもいまして・・・。

218 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 07:03:39 ]
そんなとこでメソッド分けるなよめんどいからさ

p でいろいろ表示してみるとわかるが、Hpricot の構造は

 ・ parse でパースした最初のHTML … Hpricot::Doc
 ・ 条件などで抽出されたタグ単体 … Hpricot::Elem
 ・ 条件で抽出された複数のタグ … Hpricot::Elememts

になってる。で、search や at は Hpricot::Elem にも Hpricot::Elememts にも定義されてるから、
search や at をし続ける限りにおいて、メソッドチェーンは途切れない。

ということで、「chk_aaa の返り値を Hpricot::Elememts のままにしておく」が正解。
Hpricot のオブジェクトを文字列にするのは検索や抽出操作が完全に終わった最後の最後に行う。
それまでは「○○タグを表すオブジェクト(が複数詰まった配列互換の何か)」として扱うのが楽。

class Blog
def chk_aaa(doc)
return doc.search("div.AAA")
end
def pick_BBB(doc)
return doc.search('div.BBB')
end
end

doc = Hpricot(open("example.com").read)
aaa =Blog.new.chk_aaa(site)
puts "aaaの最初は #{aaa[0].inner_html} だよー" # ← たとえば画面表示時に文字列にする
bbb = aaa.pick_BBB(aaa)


219 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 07:08:37 ]
で、aaaが途中でどーしても必要でないのなら、

class Blog
def pick_BBB(doc)
return doc.search('div.AAA').search('div.BBB')
end
end

doc = Hpricot(open("example.com"))
bbb = Blog.new.pick_BBB(doc)

とかしてくっつけてしまう、または、もしCSSセレクタの記法を勉強できるなら


class Blog
def pick_BBB(doc)
return doc.search('div.AAA div.BBB')
end
end

doc = Hpricot(open("example.com"))
bbb = Blog.new.pick_BBB(doc)

としてしまうのがコンパクトだとは思う。aaa が途中で必要なのなら仕方ないけれど。

220 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 07:55:32 ]
ああっ、ヒマだから正月中の遣り取り読んでたらなんかヒドいのがっ

>>99
> URI.escapeはURIの中に出てきたらおかしいものだけをエスケープする。
> +はURIの中に入っていても全く問題ないのでエスケープされない。
という妥当な流れから、

> +をエンコードしたいなら、CGI.escapeを使えばおk。
なんでこういう結論になるんだよ。っていうか最初にこれ言い始めた奴誰よ出てこいやオラ

>>95
URI.escape には2番目の引数がある。以下マニュアル
> URI.escape(str[, unsafe])
> URI 文字列をエンコードした文字列を返します。
> unsafe には、URI として指定できない文字を正規表現か文字列で指定します。

ということで

require 'uri'
url = 'www.google.com/search?hl=ja&q=Ruby+on+Rails&lr='
p URI.escape(url).to_s
p URI.escape(url,'+').to_s

とすると

"www.google.com/search?hl=ja&q=Ruby+on+Rails&lr= "
"www.google.com/search?hl=ja&q=Ruby%2Bon%2BRails&lr= "

になる。CGIのエスケープはURIエスケープの代わりにはできないから、これにすべき。

221 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 08:04:54 ]
御説ごもっともだが、それだと URI::UNSAFE が消えるぞ

irb> puts URI.escape('example.com/q=ねこだいすき', '+').to_s
example.com/q=ねこだいすき

irb> puts URI.escape('example.com/q=cat だいすき', Regexp.union(URI::UNSAFE, /\+/)).to_s
example.com/q=cat%20%E3%81%A0%E3%81%84%E3%81%99%E3%81%8D

うーん、めんどくさいっすな

222 名前:デフォルトの名無しさん [2009/01/08(木) 14:03:24 ]
#!/usr/bin/ruby -Ku
require 'jcode'
s = '平成21年1月1日~平成21年12月31日'
p s.split('〜')
s = '平成21年1月1日~平成21年12月31日'
p s.split('~')
なんですが、全角の〜では分割できない?
ruby 1.8.6 (2008-03-03 patchlevel 114)です。

223 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 14:12:30 ]
ruby 1.8.6 (2008-03-03 patchlevel 114) [universal-darwin9.0]
["平成21年1月1日", "平成21年12月31日"]
["平成21年1月1日", "平成21年12月31日"]

できたよ。

Unicodeの全角チルダ(FULLWIDTH TILDE)と波ダッシュ(WAVE DASH)の区別が
どーのこーのという問題だろうか。




224 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 14:22:44 ]
・ スクリプトが UTF-8 ではない
・ 2バイト文字…ああ、Unicode だから2とは限らないのか…の正規表現には u をつける

p s.split(/〜/u)

というのはどうだろ

225 名前:222 [2009/01/08(木) 14:45:13 ]
>>223
>>224
サンクス
p s.split(/〜/u)でうまくいった

226 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 21:28:38 ]
>>218-219

ありがとうございました.
やりたいことはブログタイトルや個々のエントリを構造体に入れて,構造体.エントリ.searchのようにしたかったので
aaaが発生するようになりました.

まず,returnのさいにHpricot::Elementsで返すようにして修正していこうと思います.

227 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 22:00:20 ]
226がhpricotのこと言ってるからついでに

href内にcat_xxxxx.htmlがあるaの要素をsearchするにはa[*=cat_]だけでOK?
これでやるといらないところまでついてくるんだよな

228 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 23:30:43 ]
Rubyの調べ方について質問です
例えば

blog.codezine.jp/editor/2007/10/rubyhpricot.php

を読んでいると

(doc/:h1).each do |h1|

のような表記が出ます
これについて自力で調べたいのですが、Googleは記号類を無視するようで
これが何かわからないと調べることができません

そのようなときに、皆様はどう調べていますか?
この例だと、/:h1って何だとかです
h1はHTMLのタグなのは判りますが、なぜ文字列として""で囲まないのか
また each do |h1|の|h1|は何だとか

これは例ですが、Rubyを最近使い始めてこういうところで困っています
何かいい方法があればご教授下さい

229 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 23:38:23 ]
Google先生の性癖はよくわからんが、俺だったら

Ruby "/:"

みたいにクォーテーションで括るかな。

230 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 23:40:51 ]
: はシンボルを表すやつで、
/ は除算演算子をオーバーロードしたものじゃないのか?
/: で一塊じゃないはずだ。

まあ、普通はリファレンスマニュアルの索引で調べるよ。

231 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 23:44:36 ]
Rubyを始めたばかりでhpricot使っちゃったのが不幸の始まりとしか

232 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 23:44:40 ]
ここでの/はHpricotのメソッドだね。
searchの別名だ。
最近始めたばかりというならもう少し基礎やる時間を作ればいいと思う。

233 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 23:44:59 ]
(doc/:h1).each do |h1|
の場合、
doc →Hpricot::Doc のインスタンス
/ →docのインスタンスメソッド(/演算子の多重定義)
:h1 →/ の第2引数であるシンボル
|h1| →eachに与えられたブロックの単なる引数の名前

と、まず構文の要素を正しく認識しなきゃいかんね。




234 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 23:50:34 ]
>>228はCSSセレクタやXPathをRubyマニュアルで調べるに一票

235 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 23:51:24 ]
ソース追うのに慣れてなければ
irb 上で実行して, それぞれの変数にどんなオブジェクトが入ってるのか調べるのも大事
p object.class
p object
みたいな感じで

まあわかる人ならソース追うのが一番だけど

236 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 23:54:22 ]
>>234
うわああああああ説明めんどくさああああ
>>231がそのまんまだな

237 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 23:55:18 ]
>>228
ぐぐる以前に、そのページのコードの前にある参考ページに全部
書いてあるじゃん。
一般論としてということであれば、やっぱりぐぐる以前にリファレンスなり
入門なりを読むべきでしょう。

238 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 00:17:42 ]
XP SP3、Ruby 1.8.6、エクセル2003使用者で、WIN32OLEを使ったプログラムを書いてるんですが、
エクセル操作の命令をメソッドの定義内で書いたときにエクセルのメソッド名?に空白が
含まれているものだとエラーが出てうまく動きません。
例:
def hoge
excel.Sheets(2).Select
end
は正しく動くのですが、

def fuga
excel.Sheets(2).Move After = excel.Sheets(1)
end
は"Move After"の"Move"と"After"の間に空白が入っているために
”dynamic constant assignment”というエラーが出てしまいます。
スペースをなくしたりするとこのエラーは消えますが、当然他のエラーが出ます。。

おそらく空白があるために後ろの"After"を定数と認識しているのではないかと思うんですが、どうなのでしょうか?
色々なエクセルのメソッドを自作のメソッドに定義して呼び出して一度に実行、みたいなことをさせたいと思っているんですが
文法上メソッドの定義内でこういったエクセルのメソッドを定義するのは無理なのでしょうか?
何かうまい解決策がありましたらご教授お願いします。

239 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 00:32:02 ]
>>238
> おそらく空白があるために後ろの"After"を定数と認識しているのではないかと思うんですが、どうなのでしょうか?
その通り

スペース含んでたりしてRubyがメソッド名としてうまくパースしてくれないときは Object#send を使うといい
excel.Sheets(2).send('Move After') = excel.Sheets(1)

ただWIN32OLEでExcel使ったことないから動作確認はしてない

240 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 00:37:19 ]
おなじくExcelは詳しくなくて申し訳ないが
MoveがメソッドでAfterは引数だって情報が引っ掛かったのよ
()でくくってみるってのはどう?

241 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 00:39:38 ]
win32oleは使ったことないが多分invoke使うべきだろう
ttp://doc.loveruby.net/refm/api/view/method/WIN32OLE/i/invoke

242 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 00:42:06 ]
>>229
でも>>228の該当部分の構文要素を分解すると、
「doc」「/」「:h1」なんだよな……。

243 名前:238 mailto:sage [2009/01/09(金) 01:07:01 ]
>>239
助言ありがとうございます。
教えていただいた方法を試してみたのですがダメでした・・・
syntax error, unexpected '=', expecting kEND
 excel.Sheets(2).send('Move After') = excel.Sheets(1)

>>240
助言ありがとうございます。
Move(After)ってことですよね。こちらも同様にダメでした。。
syntax error, unexpected '=', expecting kEND
excel.Sheets(2).Move(After) = excel.Sheets(1)

>>241
助言ありがとうございます。
これも同様にダメでした・・・orz
syntax error, unexpected '=', expecting kEND




244 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 01:10:32 ]
そもそもメソッドの返り値に代入なんかできないからね

245 名前:238 mailto:sage [2009/01/09(金) 01:13:01 ]
すみません、>>243に書き忘れていましたが、
>>241
excel.invoke('Sheets(2).Move After') =excel.Sheets(1)
excel.Sheets(2).invoke('Move After') =excel.Sheets(1)
excel.Sheets(2).Move.invoke('After') = excel.Sheets(1)
と試してみましたがすべて下記のエラーでした。
 syntax error, unexpected '=', expecting kEND

246 名前:227 mailto:sage [2009/01/09(金) 01:17:37 ]
わかりにくかったかもしれないから再度。
たとえば
blog.livedoor.jp/techblog/
ここのカテゴリの部分の要素を抜き取りたいのです。
div.entry-categoryで抜き出せばいいのですけど、複数あった場合はだめで、
複数あった時の共通するのはURLにcat_xxxxx.htmlとなります。
ので、hrefにcat_があればその要素を抜き出したいのですが・・・

247 名前:227 mailto:sage [2009/01/09(金) 01:20:36 ]
わかりにくいかもしれませんね。
<a href="example.com/test/cat_1234.html>カテゴリ</a>
<a href="example.com/test/cat_5678.html>カテゴリ2</a>
のカテゴリ、カテゴリ2を抜き出したいです。


248 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 01:23:08 ]
あーVBにキーワード引数が有ってそれをそのまま書こうとしてハマってるのか
多分こうだ
excel.Sheets(2).Move("After" => excel.Sheets(1) )

ttp://homepage1.nifty.com/markey/ruby/win32ole/win32ole05.html


249 名前:初心者 mailto:sage [2009/01/09(金) 01:28:42 ]
>>247
inner_htmlでおkです

250 名前:227 mailto:sage [2009/01/09(金) 01:31:10 ]
>>249
inner_textだとカテゴリ,カテゴリ2と抜き出せるのですがね。
URLにcat_を含むaタグのinner_textを抜き出したいのです。

251 名前:238 mailto:sage [2009/01/09(金) 01:32:54 ]
>>248
出来ました!
ありがとうございます!!
なるほど、そんな書き方があったんですね。
これで他のキーワード引数付きのメソッドも問題なく使えそうです。
本当にありがとうございましたm(_ _)m

252 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 01:33:11 ]
a要素を全部取ってきてselectすれば?

253 名前:228 mailto:sage [2009/01/09(金) 01:44:46 ]
みなさま、ありがとうございます

>>229
クオーテーションでくくっても、その場合Rubyのみの検索と同じです
Javaのように、やたら長いAPIだとぐぐると一発で出てくるのですが

>>230
>>232
オーバーロードだったのですね
リファレンスは見てみましたが、該当するものを見つけられませんでした
お手数をおかけしました

>>231
そうかも知れませんが、mechanizeを使うことが結構大きなモチベーションでした

>>233
丁寧にありがとうございます
|h1|はここに限らずよく使う構文ですので何となく判るのですが
一例として、これも調べるのに苦労したことがあります
使うだけなら、黙って書き写せばいいのだけど、欲張ると急に難しくなる

>>234
ありがとうございます、CSSセレクタとかは詳しくはないものの別件で調べてみました

>>235
mechanizeは結構複雑で苦労していますが、よくやっています

>>237
ごもっともですが、こういうとき普通はどう調べるのかなと疑問に感じました
Rubyは便利な機能が多いのですが、他人のコードを見て何をしているのか
今のところ自分の理解を超えているものが多く、読み解くヒントが欲しかったのです



254 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 02:03:14 ]
>>227
XPathで
//a[contains(@href, "cat_")]
という風に指定すれば意図している要素が得られる

が,HpricotのXPath対応がお粗末だから(少くとも手元のHpricotでは)うまくいかない

そこで,>>252が言うように
search('a').select{|a| /cat_/ =~ a['href']}.map{|a| a.inner_text}
みたいな感じでごまかしとけばいいんじゃない?

まあ,nokogiri使えばXPathでうまくいくかもね

255 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 02:28:09 ]
ソース見て分からないってのは基礎が出来てないからだと思うから、
詳細な解説付きの本でも読む事を勧める。

いちいちソースの解説求めてたら、答えるほうも大変だし飽きるでしょ。自分で調べて苦労してないからすぐ忘れて何度も同じ事訊くだろうし。

256 名前:227 mailto:sage [2009/01/09(金) 02:29:12 ]
>>252,>>254
ありがとうございます。
search('a').select{|a| /cat_/ =~ a['href']}.map{|a| a.inner_text}
でやりたいことができました。
XPATHの方はnokogiriいれてやってみます!

257 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 03:29:21 ]
自分のサイトのアドレスを取得する方法ってりあますか。
直にURL記述している部分があって、サーバ変えた際に色々と書き換えなどめんどうなので、
この部分をプログラムが今動いているサーバ(サイトURL)アドレスを取得して使ってくれるようにしたいのですが。

258 名前:227 mailto:sage [2009/01/09(金) 04:45:41 ]
何度もすいません。
div.abcかdiv.efgがある場合に抽出するにはsearch("div.abc||div.efg")でよいのでしょうか?
それかsearch("div.abc")がnilになった時にsearch("div.efg")するように分岐させればよいのでしょうか?

いまいち論理演算の使い土器がわからないです。

259 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 04:49:38 ]
>257
その方法を考える前に「直にURLを記述」するのを1回だけにするのはどうよ。
コードの頭の辺りで定数として入れておいて、後はコード内で補完って感じで。
そうすると書換えの時も1回で済むし、無駄なアクセスも増えないから重くもならないかと。

260 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 04:54:26 ]
url=yoursite.netみたいにね。
外部参照(だっけ?)できるようにすればそれ参照すればいいんじゃね?

261 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 05:53:39 ]
>>257
どんなフレームワーク使ってるかわからんけど
クライアントのリクエスト情報が入ったインスタンスの中を探せばあるだろ
WEBrick::HTTPRequest#hostとかCGI#server_nameとか

262 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 06:34:16 ]
>>258
search の引数には「CSSセレクタ」か「XPath」が使える(Hpricot独自の拡張も入ってるが)
どちらも「HTMLとかのタグの位置を表記する方法」だ(大雑把)

というわけでCSSセレクタの使い方でも調べとけ
他人にいちいち書き方を聞くことはなくなるだろう

263 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 06:54:42 ]
>>257
定数ENVの中に何かいいの入ってるかも

さくらインターネットと自前のLANサーバでスクリプトを共有させてたときは
LOGIN_NAMEで初期値変えてたなあ



264 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 07:25:17 ]
>>257
奥の手
require 'open-uri'
open('forts.jp/ip').read.strip

265 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 08:59:47 ]
ruby で argv を書き換える方法ってありますか?

Cだと **argv をいじると、プロセス一覧(ps等)に反映されるのですが ruby でも同じことをやりたいです

266 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 12:11:12 ]
$0

267 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 12:41:44 ]
>>257
RackならRequest#urlがある

268 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 15:46:56 ]
>>259
>>260
>>261
>>263
>>264
>>267
とりあえずファイルに設置サーバのアドレス書き込んで、
それから読み出して使うように処理変えることにしました。

色々とアドバイスありがとうございます。

269 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 17:03:54 ]
>>265
$0 = 'winny'

OSによっては駄目かもしれない。


270 名前:デフォルトの名無しさん [2009/01/09(金) 17:29:53 ]
Mechanizeで教えてください。
ブラウザでサイトに接続。
あるフォームをポストすると,ファイルがダウンロード。
そのページはかわらずそのまま。リンクやボタンをクリック可能。
(あたりまえといえばあたりまえなのですが)
という作業をMechanizeでやろうとしてます。で
agent = WWW::Mechanize.new
agent.get(hogeサイト)
agent.submit(agent.page.form(hogeフォーム))
agent.page.bodyでファイルを取得
なのですが,この段階で,agent.pageのクラスが
WWW::Mechanize::Fileになってしまって,agent.page.backとかもできない。
フォームをsubmitする前のところから,次の作業をするにはどうすればいいでしょうか?
reserve=agent.get(hogeサイト)
みたいにしても,reserveは参照だから,同じでした。

271 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 17:34:24 ]
transactとかあったような

272 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 17:36:59 ]
めんどくさいなあ

見た目に簡単なのは、WWW::Mechanize#transact を使うこと
ttp://d.hatena.ne.jp/kitamomonga/20080330/ruby_www_mechanize#www_mechanize__transact
ブロック開始時の履歴が保存されて、ブロック終了時に書き戻される

agent.get(hoge_uri)
agent.transact{|a|
a.page.form_with(:method => value).click_button.save_as(path_to_save)
}
agent.page # hoge_uriを維持


273 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 17:45:14 ]
リクツとしてわかりやすいのは、WWW::Mechanize#visited_page
d.hatena.ne.jp/kitamomonga/20080330/ruby_www_mechanize#www_mechanize__visited_page
URL を引数に渡すと、そのURLにアクセスしたときの Page オブジェクトを履歴から探してきて返す

agent.get(hoge_uri)
agent.page.form_with(:method => value).click_button.save_as(path_to_save)

agent.visited_page(hoge_uri).links_with...

agent.page の代わりに agent.visited_page(hoge_uri) を使うことで、いつでも過去の Page オブジェクトを引き出せる
いちいち書くのめんどい場合は
prev_page = agent.visited_page(hoge_uri)
とでもして変数に入れとけ

あ、Mechanize 0.8.5 より前の Mechanize を使ってる場合は form_with(:method => value) や click_button が動かないんで、
代わりに forms.method(value) や submit 使ってくれ



274 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 17:56:07 ]
transact ってそう使うのか

275 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 18:01:50 ]
>>274
たぶん、そもそもこういう用途向けに作られたんじゃないかと思われる

トランザクションと銘打っておきながらブロック内で履歴が新規に開始されていない
(ブロック直前のページがブロック内初回アクセスのリファラ候補になってる)あたりが怪しい






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<246KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef