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