なんか、鯖移転後にめんどくさくなって、
久々にページ見たら全然レイアウト崩れっぱなしだし、
放置してる間にBeautifulSoupの解説で飛んでくる人が増加してるし。
いやらしく広告とか貼っといた。

さて、Python使い始めて1年くらいになるけど、ほとんどPerlの使い方忘れてますw
ただこのタイトルはお気に入りなんで、このままにしよう。
近況は特に変化もなく、飽きずにPythonで遊んでます。
ひとまず、やりたい事は何とか出来るところまでは来たので
また隙を見て、いろいろ紹介していきます。

また、Pythonで行き詰りそうな所の解説とかやってみようと思います。
Python初心者の方とか、分からないことあったらコメント欄で適当に質問してみてください。
僕の方が初心者である可能性が大ですが、分からないなりに
一生懸命 調べて解説したいと思ってます。

スクリプトを書く上で、日本語の扱いが最初のネックになる。

pythonは、基本UTF-8で書く事を推奨する。
その場合にやらなければいけない設定は、過去にも取り上げた事がある。
内部エンコーディングに使われるエンコードをUTF-8に設定...

流れ的には、UTF-8でスクリプトを書き
出力する際に、WindowsならSJISへと変換するという形を取る。

Cygwinについては良く知らないが、
端末が対応した形式に変換して出力する癖を付けるのがベスト。
UTF-8が出力できるのなら、そのままunicodeで出力すれば、可能なはず。

print unicode(str)
# もしくは
print u"%s" % str

Jack The Getter

CDジャケット写真の画像簡単取得ツール

GUIの練習も兼ね、お気に入りのCDの
ジャケ写を取得してくるツールを作ってみました。
見た目も使いやすさも作者の性格まる出しですが
音楽が好きな人は使ってみてください。

ちなみに、起動時のアイテムチョイスは、作者の趣味です。

単純なものとして、BeautifulSoupを使ったHTML解析で
Googleの表示順位を取得するスクリプトを作ってみた。

んだから、もちろんBeautifulSoupと初期設定は必須。
そして、もちろんノンオブジェクト指向。

設定で指定した検索クエリ(q)を使用し、
Googleで検索結果を取得。
その中からURL(s)を発見したら表示するというもの。

環境により違いがあるようだが、Pythonをインストールした
初期設定のままだと、'ascii'などが内部エンコーディングに使用されるようだ。

これにより、日本語の扱いで

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinalnot in range(128)

などとエラーを吐く場合も多々あるので
以下の箇所の設定を変更する必要がある。

Perlでは、連結文字が「.」で、数値の乗算加算には「+」を用いるのに対し
Pythonでは、両方に「+」を用いることになる。
これにより、数値を連結しようとすると
必然的に、二つの数値の和になってしまう訳だ。

>>> a = 1
>>> b = 2
>>> a + b
3
>>> # "ab"にはならない

これを回避するには、str()を使う。

>>> str(a)
"1"

str()は、数値も文字列にも使用でき
どちらに対しても、文字列という型に変換することができる。

例えば、以下の例でエラーメッセージに出くわす人も
多いのではないだろうか(筆者もその一人)

BeautifulSoupが素晴らしいので
他にあまり解説サイトもないし、
簡単に使えそうなものを羅列してみた。

ただしデフォルトエンコーディングを設定している事が前提。

BeautifulSoupに渡されたHTMLは、
utf-8に文字コードを変換され自動で綺麗に生成しなおされる。
prettify()を使用すると、綺麗なソースに生成しなおされる。
※BeautifulSoup内で処理される場合は、このソースが元になる。

壊れたタグを修復という訳ではなさそうだが
改行やインデントを作り直してくれる。
Webアプリケーションとしても、かなり使えそう。

HTTPクライアントを作成するにあたり、
HTML解析周りが一番の難点となるのだが、
Pythonの標準ライブラリ(htmllib, HTMLParserなど)では、
壊れたHTMLを解析できないということなので
BeautifulSoupを試してみることに。

使ってみてぶっくり。いや、びっくり。
Perl厨には今までにない使い心地のパーサである。
しかも文字エンコーディングまで自動で取得してくれる。

インストールも超簡単なので是非使ってみるべきだ。

インストール方法
BeautifulSoupをダウンロード。
スクリプトのあるディレクトリ、もしくは
「Pythonのルートディレクトリ/Lib」に保存するだけ。

さて、本格的な使い方を追求してみようと思う。

関係ないけど、おもしろかったから覚書。

urllib2, cookielibを使用し、某管理画面にログインするが
セッションが保持できず、格闘すること数日。。。
苦戦した末、やっと行き着いた答えは
ヘッダが足りなかった事。。。。

keep-aliveという、セッションを保持させる感じの
ブラウザの機能らしいのだが、urllib2には現状では搭載されておらず
Connection: keep-alive
というヘッダは吐き出さない。

んで、付記するように
add_headerやaddheadersなど試みるが、
これはUAしか変更できないのか効果なし。

結局httplibを使用して、無理やりヘッダを作ってあげるしか思いつかなかった。
目的のページへは、ヘッダを吐き出すだけで、簡単にログインに成功した。

Keep-Aliveを保持するには、HTTPConnectionをCloseせずに
そのまま次のリクエストを送信するだけでいい。
ただし、リクエストした後には、
必ずread()を実行しなければエラーを吐く。

まぁ、普通ではあまりない仕様だと思うが
cookielibが、うまく挙動しない場合は
ブラウザが吐き出すリクエストヘッダと同じように
変更してみるのも良いだろう。

以下が、そのスクリプト。

タグクラウド

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。