- ベストアンサー
Rubyのスクローリングにおける改行文字の認識について
- Rubyのスクローリングにおいて、改行文字「¥n」を事前に挿入するものの、flagの機能が正常に機能しない状況についての質問です。
- 質問の背景として、読み込んでいるhtmlファイルは改行が少ないため、改行を挿入しないと余計な部分まで取得してしまう状況にあることが挙げられます。
- 以下のプログラムでは、ファイルを1行ずつ読み込み、特定の条件に一致する行に対してflagを立て、その後の行を取得している仕組みです。
- みんなの回答 (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に追加される ということではないでしょうか
その他の回答 (3)
- ki073
- ベストアンサー率77% (491/634)
>下記のようにカラムで整形された状態で抜き出したいのですが、それは可能でしょうか。 「下記の書き込み」が無いのですが、多分可能だと思います。 別の話になりますが、同じような構造をしたページから情報を取り出す場合には、Nokigiriを使うとうまくいくことが多いです。 特に表の中から必要なものを取り出す場合には便利です。こちらの方はタグの構造を解析して取り出します。 公開されているサイトから情報を取り出したいのであればこちらでも見てみますが。
- ki073
- ベストアンサー率77% (491/634)
No.1です。 書いたプログラムだと\nで区切られたテキストを行として処理しています。 特定のタグからタグの間を取ることも可能ですので、そうであれば書き込んでください。
- ki073
- ベストアンサー率77% (491/634)
これまでの質問も見ましたが、多分14行目の正規表現から17行目の正規表現までを取り出したいと思っているようなのですが。 それでしたら、一気にファイル全部を読み込んでしまう方が簡単です。flagを使うのは難しくするだけですので、 こんな感じでいかがでしょうか。 regx=/.*(?:保有目的が純投資目的以外の目的である投資株式の保有区分|保有目的が純投資目的以外)(?m:.*?)(?:保有目的が純投資目的である投資株式|EOF|無議決権株式|政府及び地方公共団体|普通株式|【監査報酬の内容等】).*/ txt=IO.read("index.html") strs=txt.scan(regx) p strs
補足
回答ありがとうございます。 flagを使っているのは確かに複雑にさせている原因かと思います。 確かに正規表現の部分を取り出したいのですが、下記のようにカラムで整形された状態で抜き出したいのですが、それは可能でしょうか。