- ベストアンサー
複数のWEBページから特定の文字を抜き出したいです
- アロマオンラインショップ生活の木で販売されている商品をEC-CUBEで販売するためのデータを効率的に抜き出したいです。
- 現在は一品ずつ手作業でデータをアップしているため、時間がかかり間違いも多くなってしまっています。
- ショップに問い合わせたところ、データ提供はしていないため、ネットからコピーするしか方法がありません。どのように効率的にデータを抜き出す方法があるでしょうか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
大量のファイルを処理するものを書いてみました。inというフォルダの中の拡張子htmlのファイル全部を切り出して、outというフォルダに入れるプログラムです。最初に両方のフォルダを作っておく必要があります。UNIXの書き方でフォルダを指定しているのですが、多分Windowsとの差を吸収してくれると思いますが未確認です。これは ruby -Ku program.rb で動くはずです。(-Kuが必要でしたかMacとは違うみたいですね) >最終的には「oil2.html」のファイルの文字をcsvの商品説明の項目1行目にいれて、 >さらに2行3行「oil3.html/oil4.html・・・・」と続けて入力「oil2000.html」 >くらいあるのですが・・・ ちょっと理解が出来ないのですが、ファイルリストがあるとか、それともファイルリストを作りたいとかでしょうか? 文字を追加したり改変したりも簡単ですので、書き込んでください。 >今日は一日ずっと勉強してるのですが、すごくむずかしいです(;_;) >でも頑張って、効率よくデータを抽出したいです。ご教授頂けると嬉しいです。 すごくいい心がけです。人の書いたプログラムを見て理解するのが早道のように思います。 ちょっと解説 html[%r(<div class="detailArea">.+<!--.detailArea--></div>)m] は中の%r(...)mが正規表現です。普通は/と/で囲みのですが中に/devと/が出てきますので、余り使われない%r(....)のようにしています。こっちの方が見やすいかなと思っただけです。 html[...]はhtmlの中の文字列から正規表現の部分を取り出すというものです。 # やっと6行ですね、あまりプログラムらしくないかな?? Dir.glob("in/*.html"){|fn| html=File.read(fn) open("out/"+File.basename(fn), "w"){|fo| fo.puts html[%r(<div class="detailArea">.+<!--.detailArea--></div>)m] } }
その他の回答 (5)
- ki073
- ベストアンサー率77% (491/634)
No.3の補足欄を見逃していました。(失礼しました) まともなプログラムですよ。確かめていませんが、意図したような動きするような感じですね。 ちょっと補足をしておきます。 $KCODE='u' はUTF-8を指定するのですが、実はバージョン1.9以降は効果が無くなっています。あっても害はないはずです。 プログラムの一行目に # coding: utf-8 と入れておくとUTF-8になります。2.0からは指定しないときにUTF-8に指定されたと見なされるようになったはずですが、 -Kuと指定しないとうまく行かない様ですので、# coding: utf-8を入れておけば-Kuがなくても良いかもしれません。 http://doc.ruby-lang.org/ja/1.9.3/doc/spec=2fm17n.html のmagic commentを参考に それと、プログラムを書くときに動作を確認するのに irb が便利です。一行ずつキーボードから入力して実行できるものです(検索すると使い方は出てくると思います) それとプログラムを実行するときに ruby -rdebug program.rb とすると、デバッガーが立ち上がり、途中の経過を確かめることができます。 これも検索すれば使い方がでてきます。 私自身はこのデバッガーを使いながらプログラムを書くことが多いです。 helpでコマンドが表示され、後はnとbとcの使い方を覚えれば結構使えます。 式を入力して確かめられますし、代入もできますので、非常に便利です。
お礼
お礼が遅くなりすみません、いろいろ理解してからお礼を と思っておりましたが、時間がかかりそうなので、まだまだ 勉強不足であまり理解できていませんが、先にお礼をさせてください。 今回ルビーがすごく使える!と実感しました。 今後いろいろ出来そうです(*^_^*) ki073様 ありがとうございました、 なぜ、ここまで丁寧に親切に教えてくれるのでしょうか? 一銭の得にもならないのに、こんな初心者の私に教えてくださり、本当に感謝しております。 今後、がんばって勉強していこうと思います。 お顔の見えないサイト上でのやり取りでしたが、とても人柄がうかがえ、良い方に出会えたなと思いました本当にありがとうございましたm(_ _)m
補足
>$KCODE='u' >はUTF-8を指定するのですが、実はバージョン1.9以降は効果>が無くなっています。あっても害はないはずです。 なるほど!実は初めてRUBYをした時に、文字化けするはずなのにしなくて、戸惑いました。 とりあえず、文字化けしないので、無視して進めたのですが、これで納得しました。 でも、それならエラーにならないはずなのになぜでしょうか?これは、今のところ害にならないのでほっておきます。 ちなみに、 # coding: utf-8 これでもだめでした。 irbとruby -rdebug program.rb とても便利ですね! 知っているのと知らないのでは効率が全然違います。 親切ですね(*^_^*)ありがとうございます!
- ki073
- ベストアンサー率77% (491/634)
とりあえずは何も考えずに、<div class="detailArea">から<!--.detailArea--></div>までを抜き出すプログラムを書いておきます。 program.rbの名前で保存し、入力ファイルがoil.html, 出力がoil2.htmlとしたときに ruby program.rb <oil.html >oil2.html で切り出しができます。 Macで開発しておりますので、Windowsとちょっと違うところがあるかも知れませんが、多分大丈夫だと思います。 細かい抽出はnokigiriというライブラリを使えば簡単にできるのですが、Windowsに入れるのが結構難しいので、使わなくても良い範囲で作りました。と言ってもたった2行のプログラムですが。 # 以下の2行がプログラム html=gets(nil) puts html[%r(<div class="detailArea">.+<!--.detailArea--></div>)m]
お礼
四苦八苦していました!これで抜き出しが出来るようになりました。本当に感謝感謝です(*^_^*) 最初はそのままだとエラーがでたので、-Ku を追加して実行しました。 ruby -Ku program.rb <oil.html >oil2.html
補足
さらによくを言えば大量にあるファイルをすべて抜き出したいのですが可能でしょうか? 最終的には「oil2.html」のファイルの文字をcsvの商品説明の項目1行目にいれて、さらに2行3行「oil3.html/oil4.html・・・・」と続けて入力「oil2000.html」くらいあるのですが・・・ 今日は一日ずっと勉強してるのですが、すごくむずかしいです(;_;) でも頑張って、効率よくデータを抽出したいです。ご教授頂けると嬉しいです。
- ki073
- ベストアンサー率77% (491/634)
No.1です。 インストールできましたか。まずダウンロード済みのHTMLファイルから取り出すことを考えてみましょう。 質問欄でリンクしている部分をもとに、実際に出力したいHTLMを書き込んでください。 取り出す部分が数カ所以内で、取り出した部分の加工がほとんど無いのなら正規表現使う方法が考えられますが、 大幅に書き換えたいのなら専用のライブラリを使うことになります。
お礼
何度もありがとうございます、 頑張って勉強しています。ある程度になったらお礼を・・・ と思っていたのですが、かなり難しく四苦八苦しております。 難しいですが、面白いですね。 今だけでなく、今後も勉強していきたいと思います。 とりあえずは、今したいことができるようになりたいと思いますので、よろしければお付き合い頂けると嬉しいです。 お手数をおかけして申し訳ないです。
補足
実ははじめの方で、すでにつまづいているんですが・・・ いろいろ見てみて、こんな方法で抜き出しができましたが、 私のしたいことではありませんでした。 初心者で間違いがあるだろうし、なんだかカッコ悪いんですが、今の所はこんな感じです(´Д` ) 【html抜き出し】 $KCODE='u' fpath = 'c:\Users\mame\testo.html' File.open(fpath).each_line do |bun| #空行以外だけを出力する puts bun unless bun =~ /^\s+$/ end 【画像リンク抜き出し】 $KCODE='u' fpath = 'c:\Users\mame\testo.html' #img srcに続き、空白までの文字列を取得(srcが最後だとうまくパースできないかも。。。) File.open(fpath).read.scan(/tLine([^\s]+)/) do |iii| bun.gsub!(/<[^>]+>/,"") #scanの結果は配列で返って来るので、文字列化した上で"を置換で除去 puts iii.to_s.gsub('"','') end
- pa_cotta
- ベストアンサー率43% (25/58)
このようなことを「スクレイピング」というのですが、どうしてもある程度のプログラム知識が必要となってしまいます。 秀丸のマクロでもなんとかなりそうな気もしますが、やはり知識のない方には難しいかもしれません。 有料ならいくつか候補があったのですが、無料だとライブラリ形式のものしかなく、やはり実装にプログラムの知識が必要なようです。 こちら有料なものはgoogleで調べればいくつかありましたので、よろしければ調べてみて下さい。
お礼
「スクレイピング」というのですね! この作業の名前がわからずgoogleで調べてもちんぷんかんぷんでした。「スクレイピング」で調べると結構出てくるので、嬉しいです(^-^) ありがとうございます!
- ki073
- ベストアンサー率77% (491/634)
そんなに複雑な構造をしているわけではないのですが、RubyやPerlなどの正規表現を使えるスクリプト言語を使って取り出すのが楽だと思います。 Ruby(できればバージョン2.0.0)をインストールできるのでしたら多少のアドバイスはできますが。
お礼
お礼入力もれしてましたー(+_+) いまさらですが、いろいろありがとうございました☆ 2000件あった商品の出品が終わりました! 手作業なら1時間20品が限界だったので、 本来なら100時間かかる所を、質問の時間を入れても20時間で完了出来ました!すばらしい(*^_^*)
補足
http://www.rubylife.jp/install/ ここを参考に Ruby(バージョン2.0.0)をインストール後、サンプルプログラムの実行も成功しましたので、これを使って作業できれば嬉しいです(*^_^*) お手数をおかけします、すごくありがたいです。 よろしくお願いいたします。
お礼
昨日急な用事で出かけてしまって作業ができなくて、遅くなりすみません。内容だけは見ていたので、早くテストしてみたくてしょうがなかったです(*^_^*) すごいです!出来ました(*^_^*) 私のやりたかった事です!これで作業も格段に速くなります!!! しかも、本当に見やすくて、初心者の私にも見やすく分かりやすいプログラムだし、スマートでかっこいいです! 本当にありがとうございます。なんとお礼を言っていいのやら、感謝感激雨霰です(*^_^*)