HTMLファイルからデータの抽出

データを取得したわけだが、ここから病院紹介文や給与などを抽出しよう。
まず、作業ディレクトリpmet2013を作り、そこにhtmlファイルがたくさんあるとする。
保存したファイルと病院名を取得する。

#ターミナル
ls *html > hospital.txt

HTMLファイルにはいろいろ構造があるらしく、うまくparseしたらいろいろ情報が取れるらしいのだが(HTMLParserBeautifulSoup)、よくわからなかったので文字列マッチでゴリ押しした。
また、数値だけほしいところにものすごい邪魔な注意書きみたいなことを書くやつがいるので、本当に抽出したい数列の前後を指定してsplit & joinでゴリ押しした。
抽出する要素、その要素から何回readlineするか、抽出する文字列の前、抽出する文字列の後ろ、の順。
これをheader.txtとして保存する。

<div class="matching">	1	 	<
<div class="hospno">	1	(	)
<div class="rinen_title">病院の理念</div>	2	NA	NA
<dt class="short">診療の特徴、実績</dt>	3	NA	NA
<dt class="short">電子カルテ</dt>	2	NA	<
<dt>一日平均入院患者数</dt>	2	NA<dt>一日平均外来患者数</dt>	2	NA<dt>平均在院日数(一般/精神)</dt>	2	NA<dt>年間分娩件数</dt>	2	NA<dt>年間剖検件数</dt>	2	NA<dt class="multiline">年間臨床病理研究会(CPC)<br>実施状況</dt>	2	/<dt>当院の救急医療の特徴</dt>	2	NA	NA
<dt>一日平均救急外来患者数</dt>	2	NA<dt>一日平均救急車搬送患者数</dt>	2	NA<dt>年間心肺停止状態搬送患者数</dt>	2	NA<dt>回数(月平均)</dt>	2	NA<dt>当直手当</dt>	2	NA	(
<span class="highlight">一年次</span></dt>	3	NA	円
賞与	0	与	円
<span class="highlight">二年次</span></dt>	3	NA	円
賞与	0	与	円
想定手取月額	2	約	円
<dt>研修中の人数(一年次)</dt>	2	NA<dt>研修中の人数(二年次)</dt>	2	NA<dt>昨年度受験者人数(合計)</dt>	2	NA<dt>昨年度採用人数(合計)</dt>	2	NA<dt>昨年度採用()</dt>	2	NA<dt>昨年度採用()</dt>	2	NA<dt class="block">指導医から一言</dt>	3	NA	NA
<dt class="block">先輩研修医からの病院紹介と、この病院を選んだ理由</dt>	3	NA	NA

Pythonで日本語を扱うときには、エンコーディングの問題でやたらと不都合があるらしいので、これを修正しつつ、半角文字で書いて欲しいところを全角で書くのがやつらのやり方なので、これも強制的に半角に変換する
 

wd = "/pmet2013/"
outwd = "/pmet2013/"
import codecs
import unicodedata
import re
hospitals = [h0.strip() for h0 in codecs.open(wd + "hospital.txt", "rU", "utf-8")]
#取り出す項目, readlineする回数, splitする前, splitする後ろ
hname = [g0.strip().split("\t") for g0 in codecs.open(wd + "header.txt", "rU", "utf-8")]
label = ["hpname", "matching", "hpno", "rinen", "tokutyou", "her", "adpt", "outpt", "hpdays", "birth", "outpsy", "cpc", "er", "eroutpt", "amb", "cpa", "duty", "duty_pay", "1st_pay", "1st_bonus", "2nd_pay", "2nd_bonus", "salary", "1st_dr", "2nd_dr", "applicant", "hired", "hiredM", "hiredF", "supervisor", "intern"]
#html構造内のこういうやつは邪魔なのでsplitで消すことにする。
iranai = ["<br>", "</div>", "<dd>", "</dd>"]
res = []
hname0 = [d0[0] for d0 in hname]

for h1 in hospitals:
	f0 = codecs.open(wd + h1.strip(), "rU", "utf-8")
	output = [u"0"]*len(hname)
	
	for f1 in f0:
		tmp = unicodedata.normalize('NFKC', f1.strip()) #日本語が処理できるように変換する
		tmpin = map(lambda x: x in tmp, hname0) #処理したい項目があるか
		if any(tmpin):
			tmpidx = tmpin.index(True) #処理したい項目
			for i in range(int(hname[tmpidx][1])):
				tmp = "".join(f0.readline().strip().split("\t")) #タブ区切りと
				tmp = "".join(tmp.split(",")) #カンマ区切りがうっとしい
				tmp = unicodedata.normalize('NFKC', tmp)
			
			if not all(map(lambda x:x == u"NA", hname[tmpidx][2:])) and len(tmp) != 0:
				if tmp == u"&nbsp;":
					tmp = u""
				else:
					if hname[tmpidx][2] != u"NA": #文字列先頭がある場合
						tmp = tmp.split(hname[tmpidx][2])[1].split(hname[tmpidx][3])[0]
					else: #文字列先頭がない場合
						tmp = tmp.split(hname[tmpidx][2])[0].split(hname[tmpidx][3])[0]
			
			if output[hname0.index(u"賞与")] != u"0" and tmpidx == hname0.index(u"賞与"): #賞与の項目がふたつあるので
				output[hname0.index(u"賞与", hname0.index(u"賞与")+1)] = tmp
			else:
				output[tmpidx] = tmp
	
	print h1 #邪魔ならコメントアウト
	tmpres = [unicodedata.normalize('NFKC', "".join(h1.split(".html")))] + output
	res0 = []
	#htmlの邪魔なやつらはさようなら
	for t0 in tmpres:
		for iranai0 in iranai:
			t0 = "".join(t0.split(iranai0))
		
		res0 += [t0]
	
	res += [res0]

#ファイルの書き出し
w0 = codecs.open(outwd + "result.txt", "w", "utf-8")
w0.write("\t".join(label))
w0.write("\n")
for p0 in res:
	w0.write("\t".join(p0))
	w0.write("\n")

w0.close()