プロが教える店舗&オフィスのセキュリティ対策術

こんばんは。

Rubyにおいて、改行の無いhtmlファイル(/home/edinet/**/*.html)を読み込む際に先に改行文字を入れておき、10~15行目の正規表現の通りに文字列を取得したいと考えています。

下記のままのプログラムだと改行が無いhtmlファイルであるため余計な部分まで取得してしまいます。

以下例になります。
”中外製薬(株)100株0,000,000円情報収集のため”の部分の後に指定した普通株式という文字があるにもかかわらずそれ以降も取得してしまっています。


当事業年度銘   柄株式数(株)貸借対照表計上額(百万円)保有目的
大正製薬ホールディングス(株)300,000株2,493,000,000円取引関係の強化のため
日本水産(株)8,000,000株1,736,000,000円取引関係の強化のため
大日本住友製薬(株)913,000株1,497,000,000円取引関係の強化のため
JCRファーマ(株)550,000株1,303,000,000円取引関係の強化のため
アルフレッサホールディングス(株)176,900株1,190,000,000円取引関係の強化のため
(株)スズケン157,200株628,000,000円取引関係の強化のため
東邦ホールディングス(株)243,400株531,000,000円取引関係の強化のため
(株)メディパルホールディングス319,100株503,000,000円取引関係の強化のため
コニカミノルタ(株)445,000株428,000,000円取引関係の強化のため
(株)三菱UFJフィナンシャル・グループ611,000株346,000,000円取引関係の強化のため
(株)ほくやく・竹山ホールディングス251,500株176,000,000円取引関係の強化のため
(株)みずほフィナンシャルグループ504,080株102,000,000円取引関係の強化のため
(株)バイタルケーエスケー・ホールディングス99,600株77,000,000円取引関係の強化のため
イワキ(株)29,000株5,000,000円取引関係の強化のため
塩野義製薬(株)1,000株1,000,000円情報収集のため
田辺三菱製薬(株)1,000株1,000,000円情報収集のため
小野薬品工業(株)100株0,000,000円情報収集のため
(株)三菱ケミカルホールディングス1,500株0,000,000円情報収集のため
アステラス製薬(株)100株0,000,000円情報収集のため
武田薬品工業(株)100株0,000,000円情報収集のため
エーザイ(株)100株0,000,000円情報収集のため
第一三共(株)200株0,000,000円情報収集のため
中外製薬(株)100株0,000,000円情報収集のため

普通株式296,000,000株
計296,000,000,000,000円

普通株式132,891,217株132,891,217,000,000円東京証券取引所(市場第一部)単元株式数1,000株
計132,891,217株132,891,217,000,000円――

平成14年8月2日(注)―132,891株―26,137,000,000円△8,735株22,454,000,000円

政府及び地方公共団体金融機関金融商品取引業者その他の法人外国法人等個人その他計
個人以外個人
株主数(人)―48株38,000,000円273株130,000,000円19株18,939,000,000円19,447株―
所有株式数(単元)―21,507,000,000円1,088株34,172,000,000円26,219株22,000,000円48,527株131,535,000,000円1,356,217株
所有株式数の割合(%)―16.35,000,000円0.83株25.98,000,000円19.93株0.02,000,000円36.89株100.00,000,000円―


以下のメソッドでそういった事をしようとする場合、どのようにして入れれば良いのでしょうか?

File.openとeach_line、gsub!を用いて置換して挿入する方法では上手く取得することができませんでした。

以下プログラムになります。

1 text = ""
2
3 data = Dir.glob("/home/edinet/**/*.html")
4
5 data.each do |find|
6
7 flag = nil
8 IO.foreach(find) do |line2|
9
10 case line2
11 when /保有目的が純投資目的以外の目的である投資株式の保有区分、銘柄、株式数、貸借対照表計上額及び保有目/
12 flag = true
13 when /保有目的が純投資目的である投資株式の前事業年度|保有目的が純投資目的|普通株式/
14 flag = false
15 end
16
17 text << line2.chomp if flag == true
18
19 end
20
21
22
23 text.gsub!(/<\/td>/,"\t")
24 text.gsub!(/<\/tr>/,"\n")
25 text.gsub!(/<[^>]+>/,"")
26
27 text.gsub!(/前事業年度特定投資株式/,"前事業年度")
28 text.gsub!(/当事業年度特定投資株式/,"当事業年度")
29 text.gsub!(/前事業年度  特定投資株式/,"前事業年度")
30 text.gsub!(/当事業年度  特定投資株式/,"当事業年度")
31 text.gsub!(/前事業年度\t\t\t\t\n銘   柄/,"\n前事業年度\t銘   柄")
32 text.gsub!(/当事業年度\t\t\t\t\n銘   柄/,"\n当事業年度\t銘   柄")
33 text.gsub!(/^.*nbsp.*/,"")
34 text.sub!(/銘柄\t株式数/,"\t\t\t\t\n前事業年度\t銘   柄\t株式数")
35 text.sub!(/銘柄\t株式数/,"\t\t\t\t\n当事業年度\t銘   柄\t株式数")
36 text.sub!(/銘柄\t株式数/,"\t\t\t\t\n前事業年度\t銘   柄\t株式数")
37 text.sub!(/銘柄\t株式数/,"\t\t\t\t\n当事業年度\t銘   柄\t株式数")
38 text.gsub!(/前事業年度 特定投資株式/,"")
39 text.gsub!(/当事業年度 特定投資株式/,"")
40
41 print text

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

A 回答 (3件)

No1.です。


EDINETらしいことは分かったので、「公告閲覧」で出てきたページの例を書いていきます。
ソースコードをEDINET.htmlでファイルとして保存している場合は以下のプログラムで表の中身を取り出せます。

表が2つあったので、二番目の表とするより
<DIV class="result">
の直下の表として取り出しています。また、テキスト部分に\tなどやたらあるのでそれを取り除いています。

require 'nokogiri'

doc = Nokogiri::HTML(IO.read("EDINET.html"))
div_result=doc.xpath('//div[@class="result"]')
table=div_result.xpath('table')
rows=table.xpath('tr')
results=rows[1..-1].collect{|row|
columns=row.xpath('td')
columns.collect{|c| c.text.delete("\t\r\n")}
}
p results
    • good
    • 0

こんにちは



後々のことを考慮すると、私もNokogiriの様なパーサを使用するのが良いと思いますが、いきなり習得しろというのも難しいのかもしれませんね。


> File.openとeach_line、gsub!を用いて置換して挿入する方法では上手く取得することができませんでした。

まだパーサの存在を知る前に、全く改行のないHTMLを処理したことがあったのですが、そのときは全てのタグの閉じ(>)に改行を付加して一旦別ファイルに出力し、改めてそのファイルを読んで一行ずつ処理しました。


※段付けの為、行頭に全角スペースを使用しています。
data.each do |find|

 File.open("find2.txt", "w") do |f2|
  File.foreach(find) do |line|
   line.gsub!(/>/, ">\n")
   f2.puts line
  end
 end

flag = nil
IO.foreach("find2.txt") do |line2|
    • good
    • 0

こちらにありましたね。



多分表組になっているように思いますので、Nokogiriの使用をお勧めします。
(表組になっていなくても)
    • good
    • 0

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