電子書籍の厳選無料作品が豊富!

こんにちは。

最近質問させていただいている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

ご回答の程よろしくお願い致します。

A 回答 (4件)

HTMLの内容を解析して、必要な箇所を抜き出すなら、HTMLパーサーを使うのがいいと、私も思います。


それは別の話として。


とりあえずは、理由をはっきりさせましょう。

○期待する動作
・1行ずつ確認する
・特定の文字列があったら、表示開始状態にする
・特定の文字列があったら、表示終了状態にする
・表示開始状態~表示終了状態だったら、現在の行を保存する
・表示終了状態だったらループを終了する。

ということのようです。
説明のある「現状」から考えると
・保存が開始できているので「特定の文字列があったら、表示開始状態にする」は正しくできているようだ
・終了しない、ということは
 ・終了状態にできていない
 ・現在の行が長いので、必要以上に保存されているように見える
 ・保存するべきでは無い行も保存されている
あたりが考えられます。

ここで、デバッガを使ったり、途中経過を出力させるようにしたりして、上のような現象が発生していないか、を確認していきます。例えば
file.each_line do |line2|
の後に
STDERR.printf(":%s:%s\n",flag,line2)
とでもすれば、フラグと1ine2の内容が出力されます。

要所要所に確認用の命令を入れて、期待通りになっているかを確認して、原因を掴みましょう。



で気付いたのですが、
break if flag == false
で抜けるのは
file.each_line do |line2|
のループです。その外側に
f.each_line do |file|
があります。

ということは
ファイルから1行読む(file)

適当に改行入れて分割

分割した1行ずつ処理(line2)

ファイルから1行読む(file)

適当に改行入れて分割

分割した1行ずつ処理(line2)
このとき、flag==failでも、最初の行はtextに追加される

ということではないでしょうか
    • good
    • 0

>下記のようにカラムで整形された状態で抜き出したいのですが、それは可能でしょうか。



「下記の書き込み」が無いのですが、多分可能だと思います。

別の話になりますが、同じような構造をしたページから情報を取り出す場合には、Nokigiriを使うとうまくいくことが多いです。
特に表の中から必要なものを取り出す場合には便利です。こちらの方はタグの構造を解析して取り出します。

公開されているサイトから情報を取り出したいのであればこちらでも見てみますが。
    • good
    • 0

No.1です。


書いたプログラムだと\nで区切られたテキストを行として処理しています。
特定のタグからタグの間を取ることも可能ですので、そうであれば書き込んでください。

この回答への補足

回答ありがとうございます。

flagを使っているのは確かに複雑にさせている原因かと思います。
確かに正規表現の部分を取り出したいのですが、下記のようにカラムで整形された状態で抜き出したいのですが、それは可能でしょうか。

補足日時:2014/11/27 18:41
    • good
    • 0

これまでの質問も見ましたが、多分14行目の正規表現から17行目の正規表現までを取り出したいと思っているようなのですが。



それでしたら、一気にファイル全部を読み込んでしまう方が簡単です。flagを使うのは難しくするだけですので、
こんな感じでいかがでしょうか。

regx=/.*(?:保有目的が純投資目的以外の目的である投資株式の保有区分|保有目的が純投資目的以外)(?m:.*?)(?:保有目的が純投資目的である投資株式|EOF|無議決権株式|政府及び地方公共団体|普通株式|【監査報酬の内容等】).*/
txt=IO.read("index.html")
strs=txt.scan(regx)
p strs
    • good
    • 0

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