DailyPortal Zのべつやくさんの記事をまとめるScalaプログラムを書いてみた

べつやくれいさんが書かれた記事をまとめて読みたいとふと思う。 DailyPortal Zのバックナンバーいちらん のページにまとまっているのだけど、 月別になっているし、別の方の記事といっしょくたになっているので、 私のようなべつやくさんの記事しか読んでない人間にはひじょーに使いにくい(他の執筆者の方すみません) Scalaの勉強をかねて、自動抽出するプログラムを書いてみた。 プログラムそのものよりも出力結果の方に興味を持つ方の方が多いだろうから、まず結果を張る。

出力結果

こんな感じ。 自動抽出なので、リンクが正しく張れてなかったりしても泣かない。

コード ScalaはXML Parserを言語自体の中に持っているようなのでそれを利用した。 ValidなXHTMLであれば簡単に解析できる。 但し、そうそう綺麗なHTMLは転がっていないので、 nu.validator.htmlparserを使って整形し直してから読み込んでいる。 解析している部分はこんな感じになっている。

//該当月のサマリページからべつやくさんの記事だけ抽出するメソッド
//セルの中にお名前が書いてあるのでそれを引っかけて拾っている
	def getMonthlyData(monthlyURL: String): (String, Seq[String]) = {
		val htmlString = Source.fromURL(monthlyURL, "Shift_JIS").mkString
		val node = toNode(htmlString)
		val returnValue = for(list <- node \\ "p" if((list \ "font").text == "(べつやくれい)" || (list \ "font").text == "(べつやく れい)")) yield ((list \ "a").toString)
		if(returnValue.length > 0){
			val pageTitle = (node \\ "title").text
			return (pageTitle, returnValue)
		}
		return null
	}
	
//http://portal.nifty.com/backnumber/index.htmから毎月のURLを抽出するメソッド
//相対パスで書いてあるので絶対パスに直している。
	def getMonthlyURL(summaryURL: String): List[String] = {
		val summaryPageURLObj = new URL(summaryURL)
		val htmlString = Source.fromURL(summaryURL, "Shift_JIS").mkString
		val node = toNode(htmlString)
		val pattern1 = "([0-9]+月)".r  
		val aTagList = (node \\ "td" \ "a")
		def getList(couter: Int, answerList: List[String]): List[String] = {
			if(couter >= aTagList.length) return answerList
			aTagList(couter).text match{
				case pattern1(n) =>	{
					val pageURL = (aTagList(couter) \\ "@href").toString
					val tempURL = (new URL(summaryPageURLObj, pageURL)).toString
					return getList(couter + 1, tempURL :: answerList)						
				}
				case s: String => return getList(couter + 1, answerList)
			}
			return List.empty[String]		
		}
		
		getList(0, List.empty[String]).reverse
	}

今後の課題 ・2008年以前はURLの相対パスの張り方がちょっと違うので対応する
 これはすぐできそう

・出力を見やすくする
 テーブルタグで囲むくらいならすぐできる。それ以上はセンスの問題でムリ要努力。
・cronか何かで動かしてこのページを自動更新する
 本当の意味で自動化する。そんなに難しくはないし、一回WebページをDLする程度の負荷なら問題なさそうだからそのうちやる。
・今は単純に各年ごとに1月から並んでいるけど、正確な意味で時系列順ではない
 時系列順の方が見やすいかなぁ。直すかも。
・2007年9月のファイルの読み込み
 2007年9月のサマリページhttp://portal.nifty.com/2007/09/index.htmを読み込もうとすると、
 何故かSource.fromURLがコケる。理由が分からないので調べる。
・XMLの解析とか、listの連結とかもっと効率よく書けるはず
 Scalaの勉強という意味ではこれが最優先タスクなものの、どうやって書くのが正しいのかよくわからない。
 まず偉い人の書いたソースを読み込んでみることにする。

github

玉置さん加藤さんも抜いてみました。

Written on January 7, 2012