2011年10月10日月曜日

groovyとjsoupでセレクタを使用して要素を取得する

groovyとjsoupでセレクタを使用して要素を取得するには、以下のコードのようにSelector.selectを使用します。
@Grab(group='org.jsoup', module='jsoup', version='1.6.1')
import org.jsoup.*
import org.jsoup.select.*
html = """
<html>
  <head><title>test</title></head>
  <body>
    <p id="introduction">sample page.</p>
    <p class="description">説明</p>
  </body>
</html>
"""

// 文字列からdocumentに変換
document = Jsoup.parse(html)
// selectorを使用してIDによって要素を取得
for(elem in Selector.select("p#introduction", document)){
  println(elem.text())
}
// selectorを使用してクラスによって要素を取得
for(elem in Selector.select("p.description", document)){
  println(elem.text())
}

動作環境
groovy 1.8.2, JDK6 Update27, jsoup 1.6.1

2011年10月8日土曜日

groovyとjsoupで文字列からdocumentを作成する

groovyとjsoupで文字列からdocumentを作成するには、以下のコードのようにparseメソッドを使用します。
@Grab(group='org.jsoup', module='jsoup', version='1.6.1')
import org.jsoup.*
html = """
<html>
  <head><title>test</title></head>
  <body>
    <p>sample page.</p>
  </body>
</html>
"""

// 文字列からdocumentに変換
document = Jsoup.parse(html)
// タグによって要素を取得
for(elem in document.getElementsByTag("p")){
  println("-------------------")
  println(elem.text())
}

動作環境
groovy 1.8.2, JDK6 Update27, jsoup 1.6.1

2011年10月6日木曜日

groovyとjsoupでIDによって要素を取得する

groovyとjsoupでIDによって要素を取得するには、以下のコードのようにgetElementByIdを使用します。
@Grab(group='org.jsoup', module='jsoup', version='1.6.1')
import org.jsoup.*
// htmlを取得
document = Jsoup.connect("http://groovy.codehaus.org").get()
// IDによって要素を取得してテキスト化
println document.getElementById("welcome").text()

動作環境
groovy 1.8.2, JDK6 Update27, jsoup 1.6.1

2011年10月5日水曜日

gmongoでMapReduceを使用してグループ毎の平均を求める

gmongoでMapReduceを使用してグループ毎の平均を求めるには、以下のコードのようにmap/reduce関数を使用します。
@Grab(group='com.gmongo', module='gmongo', version='0.8')
import com.mongodb.*
import com.gmongo.*

mongo = new GMongo("localhost", 27017)
db = mongo.getDB("local")
db["stores"].drop()
// コレクションにオブジェクトを挿入する
col = db["stores"]
col.insert([country:"Japan", store:"store_A", sales:100])
col.insert([country:"Japan", store:"store_B", sales:120])
col.insert([country:"Japan", store:"store_C", sales:170])
col.insert([country:"United States", store:"store_D", sales:80])
col.insert([country:"United States", store:"store_E", sales:200])
col.insert([country:"United States", store:"store_F", sales:190])
col.insert([country:"United States", store:"store_G", sales:100])
// MapReduceで国ごとの売上平均を取得
println col.mapReduce(
  [
    mapreduce:"stores",
    map:"""function(){ emit(this.country,
    {total_sales:this.sales, count:1}); }""",
    reduce:"""function(key, values){
    var total = 0;
    var total_count = 0;
    for(var vi = 0;vi<values.length;vi++){
      total += values[vi].total_sales;
      total_count += values[vi].count;
    }
    return {total_sales: total, count:total_count};
  }""",
    out:"mr_result",
    query:new BasicDBObject(),
    finalize:"""function(key, value){
    return {total_sales:value.total_sales, count:value.count,
      avg:value.total_sales/value.count}
  }"""
  ]
)
// 結果を表示
db.mr_result.find().each {
  println it
}

動作環境
Groovy 1.8.0, JDK6 Update22, gmongo 0.8, MongoDB 2.0

関連情報
gmongoのウェブサイト
https://github.com/poiati/gmongo

groovyとMongoDBのまとめ

2011年10月4日火曜日

groovyとjsoupでクラスによって要素を取得する

groovyとjsoupでクラスによって要素を取得するには、以下のコードのようにgetElementsByClassを使用します。
@Grab(group='org.jsoup', module='jsoup', version='1.6.1')
import org.jsoup.*
// htmlを取得
document = Jsoup.connect("http://groovyarekore.blogspot.com").get()
// クラスによって要素を取得
for(elem in document.getElementsByClass("list-label-widget-content")){
  println("-------------------")
  println(elem.text())
}

動作環境
groovy 1.8.2, JDK6 Update27, jsoup 1.6.1

2011年10月2日日曜日

groovyとjsoupでタグによって要素を取得する

groovyとjsoupでタグによって要素を取得するには、以下のコードのようにgetElementsByTagを使用します。
@Grab(group='org.jsoup', module='jsoup', version='1.6.1')
import org.jsoup.*
// htmlを取得
document = Jsoup.connect("http://groovy.codehaus.org").get()
// タグによって要素を取得
for(link in document.getElementsByTag("a")){
  println("link:${link.text()}:${link.attr("href")}")
}

動作環境
groovy 1.8.2, JDK6 Update27, jsoup 1.6.1

2011年10月1日土曜日

gmongoでMapReduceを使用して最小値・最大値を求める

gmongoでMapReduceを使用して最小値・最大値を求めるには、以下のコードのようにmap/reduce関数を使用します。
@Grab(group='com.gmongo', module='gmongo', version='0.8')
import com.mongodb.*
import com.gmongo.*

mongo = new GMongo("localhost", 27017)
db = mongo.getDB("local")
db["stores"].drop()
// コレクションにオブジェクトを挿入する
col = db["stores"]
col.insert([country:"Japan", store:"store_A", sales:100])
col.insert([country:"Japan", store:"store_B", sales:120])
col.insert([country:"Japan", store:"store_C", sales:170])
col.insert([country:"United States", store:"store_D", sales:80])
col.insert([country:"United States", store:"store_E", sales:200])
col.insert([country:"United States", store:"store_F", sales:190])
col.insert([country:"United States", store:"store_G", sales:100])
// MapReduceで国ごとの売上を取得
println col.mapReduce(
  /* map */ """function(){ emit(this.country,
    {min_sales:this.sales, max_sales:this.sales}); }""",
  /* reduce */ """function(key, values){
    var firstobj = true;
    var minval = 0;
    var maxval = 0;
    for(var vi = 0;vi<values.length;vi++){
      if( firstobj ){
        minval = values[vi].min_sales;
        maxval = values[vi].max_sales;
        firstobj = false;
      }
      if( minval > values[vi].min_sales)minval = values[vi].min_sales;
      if( maxval < values[vi].max_sales)maxval = values[vi].max_sales;
    }
    return {min_sales:minval, max_sales:maxval};
  }""",
  /* outputTarget */"mr_result",
  /* query */ new BasicDBObject()
)
// 結果を表示
db.mr_result.find().each {
  println it
}

動作環境
Groovy 1.8.2, JDK6 Update22, gmongo 0.8, MongoDB 2.0

関連情報
gmongoのウェブサイト
https://github.com/poiati/gmongo

groovyとMongoDBのまとめ