![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
こんにちは。
最近質問させていただいている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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) excel VBA if文について 3 2022/03/27 17:42
- Visual Basic(VBA) ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい 11 2022/12/24 17:46
- その他(プログラミング・Web制作) pythonのDjangoでHTML内で変数を利用したいです 3 2022/05/15 15:33
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/07/13 12:31
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- その他(プログラミング・Web制作) pythonのこのエラーがわかりません 3 2022/11/16 14:54
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) エクセルのマクロについて教えてください。 3 2023/02/22 08:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
前回の質問の続き
-
あせんうぶり言語
-
ビーリアルのユーザー名を変え...
-
100万件越えCSVから条件を満た...
-
WSLのUbuntuで、Railsのインス...
-
再起動後必ず2つのエラーが出...
-
WinSCPで画像のように puttyを...
-
教えてください
-
パソコンのスクリーンセーバー...
-
英数字を含む文字列(0-9,A-Z)...
-
PysimpleGUIでデータベースを作る
-
Beautiful Soupのインストール...
-
Ruby on railsをrails sで立ち...
-
回復ドライブとインストールメ...
-
これらは書誌情報だと思うので...
-
じゃんけんのプログラムを作っ...
-
C言語の入力した文字を反転させ...
-
Accessで文字列のバイト数読み込み
-
符号付整数の演算結果を答えよ ...
-
実行時エラー450:引数の数が一...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Rubyの正規表現、文字の追加
-
「&」 「<<」 「|」 につ...
-
Ruby 正規表現による文字列取得
-
Ruby 正規表現で特定の文字を取...
-
Ruby flagによるファイルの特定...
-
バッチ処理 特定の文字以降を...
-
【ExcelVBA】300万件越えCSVか...
-
Excelマクロ 空白セルを無視し...
-
ダブルコーテーション付きでCSV...
-
VBAでcsvファイルもシートもあ...
-
ファイル名を変数で書きこむfwr...
-
VBA テキストボックスを選択状...
-
Access VBA エラー2448について
-
[コンパイルエラー 修飾子が不...
-
fortranでNAのあるデータを読み...
-
C# ファイルを読み込みlistvie...
-
VB.netでShellExecuteがしたい
-
SQLファイルの読み込み
-
EXCEL→CSV保存時のダブルクォー...
-
複数のファイルをまたぐエクセ...
おすすめ情報