Scalaでhtmlファイルを読み込んでいろいろ処理をしたいときがあります.DOMの構造に落とすことが出来るのでやってみました(2015.6.9) Scalaのversionは 2.10.4.Eclipse4.4上で Scalaは pluginで入れました.
まず準備
nu.validator.htmlparser.dom.HtmlDocumentBuilderを使うためにインストールします.googleで検索して htmlparser-1.4.zip というファイルをdownloadします.
次に展開して htmlparser-1.4.jar ファイルをEclipseの Scalaに読み込ませます.やり方はEclipseの [プロジェクト]>[プロパティ]>[Javaのビルド・パス]の[ライブラリー]タブを開き,「外部jar追加」でさきほどの htmlparser-1.4.jarを読み込ませます.これでnu.validator.htmlparser.dom.HtmlDocumentBuilderをimport出来ます.
プログラム
import scala.io.Source
import nu.validator.htmlparser.dom.HtmlDocumentBuilder
import java.io.StringReader
import org.xml.sax.InputSource
object Domp {
def main(args: Array[String]) {
val builder = new HtmlDocumentBuilder()
val source = Source.fromFile("/home/なにかhtmlのファイル")
val sreader = new StringReader(source.mkString)
// parseをします
val dom = builder.parse(new InputSource(sreader))
// 一番上の一つ下の子供はhtml.なのでその下を取ってみます
val child = dom.getChildNodes().item(0) //この0番目は トップのhtml
val size = child.getChildNodes().getLength //htmlの下を取る
//どうもJavaベースらしく配列に対して数を数えてループを回さないととれない!?
for(i <- 0 until size){
println("i="+i) //何番目の子供か表示させてみました
println (child.getChildNodes().item(i).getNodeName) //子のタグ名
}
}
}
入力のファイルはこんな感じ
test.html
<html>
<title>テストタイトル</title>
<body>
<h1> テスト </h1>
</body>
</html>
すると出力は下記のようになります
i=0
head
i=1
body
つまり htmlのタグの下には titleとbodyタグが子ノードしてあることがわかります.
childなどの型は org.w3c.dom.Nodeなのであとは調べるといろいろメソッドがありそうです.