• 締切済み

ruby のプログラムについての質問です。

ruby初心者です。作成したプログラムについて質問です。 某サイトの<td>セクター部分のデータを取得するプログラムを作ろうとしています。このプログラムのソースをあげときます。 # encoding: utf-8 require 'rubygems' require 'open-uri' require 'nokogiri' doc = Nokogiri::HTML(open("http://creofuga.net/"),nil,"utf-8") doc.css("td").each do |td| open("foo.txt", "w") do |f| f.write td.text end end このプログラムだと、最初のからデータを取得していくのですが、textファイルに書き込む際、1行目で得たデータを上書きをし、最終的に、サイトの最後の出たのみ出力する形となります。これをデータごとに改行しすべてのデータを出力するにはどのようにプログラムを変更すれば、よいかおしえてください。おねがいします。ちなみに最後に画像で取得したtextファイルのデータを上げときます。よろしくお願いします。

  • Ruby
  • 回答数1
  • ありがとう数1

みんなの回答

  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.1

doc = Nokogiri::HTML(open("http://creofuga.net/"),nil,"utf-8") open("foo.txt", "w") do |f| doc.css("td").each do |td| f.write td.text end end 自分で少しでも考えましたか?あるいはプログラミングの入門書とか読んだことがありますか?

zerozero5320
質問者

お礼

一生懸命考えたのですがよくわかりませんでした。ありがとうございます。

関連するQ&A

  • Nokogiriスクレイピングがうまくできない。

    Nokogiriスクレイピングがうまくできない。 RubyのNokogiriを利用して、下記サイトのデータを整理するためにスクレイピングをしようと思っています。 https://sv.j-cg.com/compe/view/entrylist/1274 具体的には、サイト中部の「登録デッキ」の一覧にある使用クラスのデータをまとめるプログラムを組もうと思っています(添付画像参照)。 XPathのサイトを参考にしつつ、試しにこの使用クラスの画像データをテキストで出力するため以下のコードを組んで実行しました。 require 'nokogiri' require 'open-uri' url = 'https://sv.j-cg.com/compe/view/entrylist/1274' charset = nil html = open(url) do |f| charset = f.charset f.read end doc = Nokogiri::HTML.parse(html, nil, charset) p doc.xpath('//img[contains(@src,"clans")]') ですが、 [] と表示されるだけで何も取得できません。 containsの引数を(取得対象のimg要素内の)どの値に変えて試しても、色んな表示が出はするのですが肝心の画像URLの部分が取得できません。 (ページのソースコードを見た所、使用クラスの判別が画像URLでしか出来ないため、URLをまず取得しないことには目的を達成できないだろう、という前提で話しています。) 私の推測では、どうやらURL部分だけjsonファイルらしい(他者には見られない)外部のファイルから引っ張ってきているため、プログラムから読み取ろうとしてもうまくURLを引用できないのだと思ってます。 ですが、ブラウザ上の検証ツールではURLが表示されるのにプログラムでは正しく読み込めないのが疑問です。 何にせよ、うまく使用リーダーを整理する方法があったら教えていただきたいと思います。 (ちなみにスクレイピングで画像URL等を取得した後のうまい整理方法も現段階ではよくわかっていないですが、とりあえずこのURLデータ取得だけでもまず理解してからということで質問をしています。)

  • Rubyの株価ダウンロードプログラム

    以下は、Yhooファイナンスからの株価ダウンロードプログラムらしいのですが、私にはどういったことをしているのか、いまいちわかりません。 どなたか解説していただけませんか。 require 'open-uri' require 'nkf' require 'jcode' require 'date' $KCODE='s' # 漢字コードをEUCに。Windowsでは 's' #****シフトJISに変換**** class String def to_sjis henkan = NKF.nkf('-s', self) henkan end end #*************** today = Date::today regEx = '(\d+)年(\d+)月(\d+)日<\/small><\/td><td><small>([\d,]+)<\/small><\/td><td><small>([\d,]+)<\/small><\/td><td><small>([\d,]+)<\/small><\/td><td><small><b>([\d,]+)<\/b><\/small><\/td><td><small>([\d,]+)<\/small><\/td><td><small>([\d,]+)' 1301.upto(9999) do |meigara| begin begin meigaradatafile = open("#{meigara}.csv" , "r" ) rescue puts "#{meigara}" + 'は存在しません' meigaradatafile = open("#{meigara}.csv" , "w" ) meigaradatafile.close meigaradatafile = open("#{meigara}.csv" , "r" ) end meigaradata = meigaradatafile.readlines if meigaradata == [] lastdate = Date::new(1983 , 1 , 4) else meigaradatalastline = meigaradata[meigaradata.length-1].split(/\s*,\s*/) lastyear = meigaradatalastline[0] lastmonth = meigaradatalastline[1] lastday = meigaradatalastline[2] meigaradatafile.close lastdate = Date::new(lastyear.to_i , lastmonth.to_i , lastday.to_i) if lastdate >= today next end lastdate = lastdate + 1 end starttime = Time.now temp2 = String.new max = today - lastdate 0.step(max , 50) do |i| begin f = open("http://table.yahoo.co.jp/t?s=#{meigara}.t&a=#{lastdate.month 5;&b=#{lastdate.day}&c=#{lastdate.year}&d=# 23;today.month 5;&e=#{today.day 25;&f=#{;today.year}&g=d&q=t&y=#{i}&z=#{meigara}.t&x=.csv") rescue TimeoutError puts 'タイムアウト リトライ' retry end str = Array.new temp = String.new temp = f.read.to_sjis temp3 = Array.new temp.each_line do |line| line = line.gsub("," , "") if line.scan(/#{regEx}/) != [] str.push line.scan(/#{regEx}/) end end p meigara.to_s + ':' + i.to_s if str == [] break end str.each do |j| temp3.push j end temp3.each do |k| temp2 = k.join(",").to_s + "\n" + temp2 end end if temp2 != "" foo = open("#{meigara}.csv",'a') foo.puts temp2 foo.close end elapsedtime = (Time.now - starttime)/60 yosou = elapsedtime * (9999 - meigara.to_i) puts meigara.to_s + ' ' + '経過時間' + ':' + (elapsedtime.to_s) + '予想時間' + ':' + (yosou/60/60).to_s rescue retry end end

  • rubyでPDFファイルを読みたい

    PDFファイルを、rubyで読み込みたいのですが、 そのようなことを可能にする方法(ライブラリ)は、ありますでしょうか? つまり、 f = open "index.txt" f.each do |line|  puts line end この場合の「index.txt」が、テキストファイルでなく、 「index.pdf」というPDFファイルだった場合にも 同様の出力結果を期待したい、ということです。 (バイナリデータではなく、テキストデータを出力したい。) 実現手段をご存知の方がいましたら、何卒、教えて下さい。

  • rubyに関する質問です。

    rubyに関する質問です。 require 'open-uri' open("uri") do |f| 5.times do print f.gets end end これを実行すると <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>繧ェ繝悶ず繧ァ繧ッ繝域欠蜷代せ繧ッ繝ェ繝励ヨ險?隱・Ruby</title> Complete(0) このように日本語のところだけ文字化けしてしまうのですが、どのようにすれば文字化けがなおるのでしょうか?

    • ベストアンサー
    • Ruby
  • Ruby 改行文字の認識

    こんにちは。 最近質問させていただいているRubyのスクローリングの際に1行ごとに文章を判定し、flagを立てて取得しているのですが、下記のプログラムで改行文字「¥n」を事前に挿入しているにもかかわらずflagがうまく機能しないため質問させていただきました。 読み込んでいるhtmlファイルは改行が少ないファイルであるため、改行を入れてあげなければ余計な部分まで取得してしまう状態です。 以下プログラムです。 1 text = "" 2 data = "/home/edinet/E05267/S1001YX6/index.html" 3 4 flag = nil 5 6 File.open(data) do |f| 7 8 f.each_line do |file| 9 file.gsub!(/<\/tr>/,"\n") 10 11 #IO.foreach(file) do |line2| 12 file.each_line do |line2| 13 case line2 14 when /保有目的が純投資目的以外の目的である投資株式の保有区分|保有目的が純投資目的以外/ 15 flag = true 16 17 when /保有目的が純投資目的である投資株式|EOF|無議決権株式|政府及び地方公共団体|普通株式|【監査報酬の内容等】/ 18 flag = false if flag == true 19 20 end 21 22 text << line2 if flag != nil 23 break if flag == false 24 25 end 26 text.gsub!(/<\/td>/,"\t") 27 #text.gsub!(/<\/tr>/,"\n") 28 text.gsub!(/<[^>]+>/,"") 29 print text 30 31 end 32 end ご回答の程よろしくお願い致します。

    • ベストアンサー
    • Ruby
  • rubyのmarkabyの出力の件です

    rubyでmarkabyの使用するとhtmソースが普通のエディタでみれません どうしたら表示できるかをよろしくお願いいたします。 =====make_htm.rb/================================================ require 'rubygems' require 'markaby' html = Markaby::Builder.new do head { title 'マイホームページ'} body do h1 "ようこそ" b "項目" ul do li "ライン1" li "ライン2" li "ライン3" end end end puts html =====make_htm.rb/end================================================ を実行すると <head> <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/> <title>& #12510;& #12452;& #12507;& #12540;& #12512;& #12506;& #12540;& #12472;</title> </head> <body> <h1>& #12424;& #12358;& #12371;& #12381;</h1> <b>& #38917;& #30446;</b> <ul> <li>& #12521;& #12452;& #12531;& #65297;</li> <li>& #12521;& #12452;& #12531;& #65298;</li> <li>& #12521;& #12452;& #12531;& #65299;</li> </ul> </body> と出力されます(改行はあとで付加しました&と#の間にわざとスペースいれてます) これをブラウザでみればちゃんとみえるのですが htmのソースの状態で <head> <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/> <title>マイホームページ</title> </head> <body> <h1>ようこそ</h1> <b>項目</b> <ul> <li>ライン1</li> <li>ライン2</li> <li>ライン3</li> </ul> </body> と出力するにはどうしたらいいでしょうか str = html.to_s puts Iconv.conv('Shift_JIS','UTF-8',str) とやってみても変わりませんでした。 よろしくご教授おねがいいたします。

    • ベストアンサー
    • Ruby
  • ruby erbでの表示がうまく行きません。

    本当に初心者ですので、質問が分かりづらいかもしれませんが、よろしくお願いします。 環境は、OS:WindowsXPSP3 ApacheHttpserver2.2 Ruby-186-26 RubyGems -v 0.9.4 です。 erbを使って簡易掲示版を作ろう!!と言うものなのですが、 ・keijiban.html ・keijiban.rb ・data.csv(書き込んだデータ保存用csv)・・・cgi-binに保存 ************************************************************ 入力ミスは散々見直しました。 添付ファイルが2つのファイルです。localhostで表示してみていますが、 初期表示は出来ますが、データを追加しようと『投稿する』ボタンをクリックすると 画面が真っ白になります。 入力ミスは散々見直しました。 初期表示が出来ると言う事は、keijiban.rbは動作していると思われます。 REDで簡易解析と言うのをしてみた所、次のエラーが出たり出なかったりです。 C:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require': no such file to load -- rde (LoadError) from C:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require' from C:\Program Files\RDE\rde_export.rb:9 from C:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require' from C:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require' from C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin/rb1D.tmp:71 Complete(1) 何か、インストールが足りないのでしょうか? 教えて下さい。 2000字超えたため、別ファイルに全文を記入しています。

    • ベストアンサー
    • Ruby
  • Rubyプログラムヘッダ部分の書き方

    度々すみませんが、他人のRubyプログラムを試しながら勉強しているのです。 今回の質問はプログラムの先頭の書き方です。ご存知の方にご教示を頂きたいのです。 ついでに、こちらの動作環境はLinux-Mint、Ruby1.9.3です。 次のはサンプルプログラムの先頭の5行です。  1 #!/usr/bin/env ruby  2 # -*- mode:ruby; coding:utf-8 -*-  3 require 'kconv'  4 require 'moji'  5 Encoding.default_external = "utf-8" 質問1: 2行目は処理する文字コードがUTF-8の指定に見えます。どんな場合に必要ですか。 実はあるプログラムをUTF-8のデータを処理するときに、2行目があると invalid multibyte char (UTF-8) のエラーが出ました。抜いたら正常処理します。 質問2: 3、4行目は、日本語処理のクラスを利用するためのライブラリ指定ですが、 使い分けがよく分からないのです。 質問3: 5行目はどんな場合に必要でしょうか。2行目と同じような役割に見えますが.... 初歩的な質問ばかりですが、どうぞよろしくお願いいたします。

    • ベストアンサー
    • Ruby
  • 【Ruby】テキスト置換を1ファイル完結にしたい

    memo.txtの中に含まれている"俺の飯"という文字列を"私のごはん"というふうに置換を行いたいのですが、 現在のやり方だとファイルを開いて1行ずつ読み込んで新しいファイルに文字列を書きだしており 読み込んだ際、置換対象の文字列があった場合に置換して書きだしておりますが このやり方だとどうしても新規ファイルを出力しなければいけません。 これを新規ファイルを作らずにmemo.txtの中身だけを書き換えるようにするには どのような処理にすれば良いのでしょうか? 何卒宜しくお願い致します。 ---- sample.rb require 'rubygems' open("memo.txt"){ |f| open("after_memo.txt","w"){ |o| while line = f.gets line.gsub!("俺の飯", "私のごはん") o.puts line end } } -- memo.txt 俺の飯はリーズナブル! 俺の飯美味しそう!

    • ベストアンサー
    • Ruby
  • FORTRANのプログラム

    今、実験の解析を行っています。 読み込みたいテキストファイルには -1,0.4 0,0,233 -1,0.9 ・・など左側には-1か0のどちらかがあります。 これを -1,0.4 -1,0.9 を含むファイルと 0,0.0233 を含むファイルの二つに分けたいのです。 今プログラムを作っているのですがどうしてもできません。 どうしたらいいのでしょうか? program dat real x(10), y(10) open(7,file='test.txt') do i=1,10 read(7,*,end=200) x(i),y(i) end do do j=1,10 if(x(j).eq.0.0) then open(8,file='aftest1.txt') write(8,*) y(j) else open(9,file='aftest2.txt') write(9,*) y(j) end do close(8) close(9) 200 close(7) end

専門家に質問してみよう