‘python’ タグのついている投稿

DjangoでJinja2を使いたいという話

2011年10月13日 木曜日

先ほどの記事にも書いたようにAppStatsは、Kay frameworkで途中まで書いたコードをDjangoに移植したんですが、その際にテンプレートエンジンの差異に少し戸惑いました。

Kayで採用されているjinja2はDjangoの標準テンプレートに良く似せて作られていて、Djangoを触った事があれば違和感無く使い始められます。ところがDjangoでイマイチな部分が解消されていて、一度jinja2を使ってしまうとDjangoに戻ってきた時にイライラしてしまうという問題が生じます。jinja2の何が良いかというと、例えばdjangoのドット記法はヤダとか、テンプレート中で関数呼び出しを見慣れている形で記述できるとか、デフォで{% macro %}が使える等などです。

正直macroなんかは一回使ったらもう同等機能がないテンプレートシステムなんて使えないです。という訳でDjangoでもjinja2を使いたいということで、調べた方法を記録しておきます。

(続きを読む…)

Hello Tcl/Tk World

2010年12月20日 月曜日

GUIっぽい実験するのにTcl/Tkが良いんじゃないかっていう事で、ちょっとかじってみる事にしました。とりあえずtclでfizzbuzzやってみたのが以下になります。インタプリタのコマンドはtclshです。情報源としては公式ドキュメントのチュートリアル最速文法マスター見ながらなめれば何となくならコード書けるかなぁと思います。

(続きを読む…)

PythonでMovableTypeのXML-RPCインターフェースを叩く

2010年11月26日 金曜日

MovableTypeにはXML-RPCインターフェースが準備されているので、外部から新しい記事を投稿したり過去の記事を取得したりできます。MT自体のリファレンスを探せなかったので、コチラのページを参考にさせて頂きました。

(続きを読む…)

Hello Cython World

2010年10月24日 日曜日

lxmlのソースを読もうとしたらcythonというPythonの拡張を書くためのPythonとCの間の子みたいな言語で書かれているという事で、全く知らないままだとlxmlのソースに挑む気が起こらなかったので少し調べてみました。まぁ調べてみたといってもcythonのドキュメントの最初に書かれているGetting Startedを舐めただけなんですけども。

(続きを読む…)

Pythonで実行時間とメモリの測定をする

2010年10月3日 日曜日

しばらくベンチマークコードを書いてなくてすっかり忘れていたので、メモ書きです。今回は例題として、yahooのこのページをBeautifulSoupとlxmlでのスクレイピング比較をしてみる事にしました。比較対象の関数は以下の通りです。どちらのコードも入力・出力ともに同じなので、どちらが実行時間やメモリ使用量が少ないのかを知りたくなりますね。

# BeautifulSoup
def scrape_with_bs(html):
  from BeautifulSoup import BeautifulSoup  
  soup = BeautifulSoup(html)
  rows = soup.find('table', attrs={'class':'channel9'}).findAll('tr')
  channels = rows[0].findAll('td', attrs={'class':'station'})
  programs = rows[1].findAll('td', attrs={'class':'turnup'})
  res = []
  for ch, prog in zip(channels, programs):
    res.append((ch.find('span').string, ch.find('a').string, prog.find('a').string))
  return res
 
# lxml
def scrape_with_lxml(html):
  import lxml.html
  root = lxml.html.fromstring(html.decode('utf-8'))
  rows = root.xpath('//table[@class="channel9"]/tr')
  channels = rows[0].xpath('td[@class="station"]')
  programs = rows[1].xpath('td[@class="turnup"]')
  res = []
  for ch, prog in zip(channels, programs):
    res.append((ch.xpath('span/text()')[0], \
          ch.xpath('descendant::a/text()')[0], \
          prog.xpath('descendant::a/text()')[0]) )
  return res

ちなみに上記の関数から得られる配列をprettyprintすると、以下の様な出力が得られます。各チャンネルごとに、今放送中の番組を取得しています。

[
    [
        "アナログ1ch", 
        "NHK総合", 
        "ニュース"
    ], 
    [
        "アナログ3ch", 
        "NHK教育", 
        "ハーバード白熱教室@東京大学「イチローの年俸は..."
    ], 
    [
        "アナログ4ch", 
        "日本テレビ", 
        "真相報道 バンキシャ!"
    ], 
    [
        "アナログ6ch", 
        "TBS", 
        "THE世界遺産「皇帝たちの地下宮殿」〜..."
    ], 
    [
        "アナログ8ch", 
        "フジテレビ", 
        "笑顔がごちそう ウチゴハン"
    ], 
    [
        "アナログ10ch", 
        "テレビ朝日", 
        "ドライブ A GO!GO!「群馬格安温..."
    ], 
    [
        "アナログ12ch", 
        "テレビ東京", 
        "TOKYO ..."
    ], 
    [
        "アナログ14ch", 
        "TOKYO MX", 
        "芸術史と芸術理論( 10)第1回◇放送..."
    ]
]

(続きを読む…)