Scalaでhtmlをパース (DOM) (2015/6/9)

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なのであとは調べるといろいろメソッドがありそうです.

参考: http://blog.mwsoft.jp/article/45131631.html