こんにちは。
最近質問させていただいている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
ご回答の程よろしくお願い致します。
No.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に追加される
ということではないでしょうか
No.3
- 回答日時:
>下記のようにカラムで整形された状態で抜き出したいのですが、それは可能でしょうか。
「下記の書き込み」が無いのですが、多分可能だと思います。
別の話になりますが、同じような構造をしたページから情報を取り出す場合には、Nokigiriを使うとうまくいくことが多いです。
特に表の中から必要なものを取り出す場合には便利です。こちらの方はタグの構造を解析して取り出します。
公開されているサイトから情報を取り出したいのであればこちらでも見てみますが。
No.1
- 回答日時:
これまでの質問も見ましたが、多分14行目の正規表現から17行目の正規表現までを取り出したいと思っているようなのですが。
それでしたら、一気にファイル全部を読み込んでしまう方が簡単です。flagを使うのは難しくするだけですので、
こんな感じでいかがでしょうか。
regx=/.*(?:保有目的が純投資目的以外の目的である投資株式の保有区分|保有目的が純投資目的以外)(?m:.*?)(?:保有目的が純投資目的である投資株式|EOF|無議決権株式|政府及び地方公共団体|普通株式|【監査報酬の内容等】).*/
txt=IO.read("index.html")
strs=txt.scan(regx)
p strs
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBScriptでExcel(2019)上のデー...
-
(再質問)エクセルのマクロボ...
-
pandasでsqlite3にテーブル作成...
-
英数字を含む文字列(0-9,A-Z)...
-
教えてください
-
Ruby on railsをrails sで立ち...
-
じゃんけんのプログラムを作っ...
-
100万件越えCSVから条件を満た...
-
VBA メモ帳の上書き保存がしたい
-
Accessで文字列のバイト数読み込み
-
WSLのUbuntuで、Railsのインス...
-
ビーリアルのユーザー名を変え...
-
プログラミング講師はまだ需要...
-
1、Rstudioで回帰直線を求める...
-
IDLE.Shell 3.10.0
-
Excel関数と条件付き書式:製造...
-
A4 持ち込み
-
前回の質問の続き
-
あせんうぶり言語
-
これらは書誌情報だと思うので...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Ruby 正規表現で特定の文字を取...
-
Ruby 正規表現と置換
-
Rubyにおける、XPathの関数「te...
-
Rubyの正規表現、文字の追加
-
Ruby 改行文字の挿入
-
バッチ処理 特定の文字以降を...
-
VBAでcsvファイルもシートもあ...
-
Excelマクロ 空白セルを無視し...
-
ダブルコーテーション付きでCSV...
-
【ExcelVBA】300万件越えCSVか...
-
ファイル名を変数で書きこむfwr...
-
VBA テキストボックスを選択状...
-
[コンパイルエラー 修飾子が不...
-
fortranでNAのあるデータを読み...
-
SQLファイルの読み込み
-
複数のファイルをまたぐエクセ...
-
teratermで、ファイル名をinput...
-
VB.netでShellExecuteがしたい
-
VBAで複数のCSVからレコードセ...
-
Fortran:列数の分からないデー...
おすすめ情報