HTMLの分析を行う際、タグを巡回する必要がありますがそんなとき、lxmlを使うと便利です。
lxmlでは、タグの入れ子関係が壊れたHTMLの修復も自動で行ってくれる機能がありますのでユーザは細かいことを気にする必要はありません。この修復機能のおかげで、入れ子の修復(閉じ括弧がないタグは閉じ括弧を付与)を行ってくれるため、HTMLをツリーとして、つまりDOMツリーとして捉えることができるようになるのです。
DOMツリーだから何やねん!という方は読み飛ばしてもらっていいのですが、ツリーであるおかげで親ノード(親タグ)をたぐったり、兄弟ノード(兄弟タグ)をたぐったりが簡単にできるようになるのですね。lxmlってすばらしい。
木を巡回する手法はいろいろとありますが、今日は深さ優先で巡回する手法をみてみましょう。
lxmlは文字コードを厳格に定義しており、入力時は必ず「unicode」化しておく必要があります。
これだけでも注意しておかなければならない点ですが、lxmlには、出力用の「tostring()」というメソッドを持っており、ここでも文字コードの注意が必要となってきます。
PythonでXML/HTMLをパースする場合、
と
の大きく2つが存在しています。
前者は以前このブログでも紹介していますので、ご覧下さい。DOMベースなので気軽にパース処理することができる反面、少々処理が重いです。
一方後者は、XPATHと呼ばれる問い合わせ言語(まぁ、SQLのようなもんです)をある程度理解する必要はありますが、メモリもそんなに使わず大変高速なため、phactoryではよく使っています。
今日はこのlxmlを使ってタグ抽出する方法を紹介します。
pythonでHTTP通信する場合、urllib, urllib2あたりを使うことが多いと思います。
手軽で簡単ではあるのですが、どちらもレスポンスコードを取得することができません。
「レスポンスコードをどうしても取得したい!」という場合は、httplibを使いましょう。
Djangoは、クラス定義(モデル)とデータベーステーブルとを関連付けるORM(Object-Relation Model)というフレームワークを採用しています。そのため、SQLやRDBのことが分からなくても、Python & Djangoの知識だけである程度データベースを利用することができます。
データベースとしては、PostgreSQL / MYSQL / Sqlite などが利用可能ですが、これらすべてが既存のテーブルに対して、カラムの追加・変更・削除処理をサポートしている訳ではありません。例えば、PostgreSQLはカラムの追加はできますが、変更(型や名前の変更など)はできません。
これらは、サポートしているデータベースが提供しているサービスで、共通部分のみしか使わないというDjangoの思想に基づいています。なので、モデル定義の変更・削除も同様に、
$ python manage.py syncdb
では対応できないのです。
これを解決するためのDjangoアプリケーションがあります。
「django-evolution」です。
これを使えば、モデルの変更・削除が実現できます。
今回は、Pinaxのインストール方法について説明します。Pinaxのインストールは前バージョンである0.5.1から大きく様変わりしています。前回までは、Pinax自体のパッケージをPythonパスの通ったところに配置するだけでよかったのですが、今回はインストーラが附属していたり、Pinaxが動作するために必要な外部パッケージ(Djangoなど)も同時にインストールされるようになっています。
Pinaxは、Djangoフレームワークで実装されたアプリケーション集です。
デフォルトのテンプレートも最初から提供されているため素早くサイトを立ち上げることが可能です。
用途に応じて、個人のブログサイトやコーポレートサイト、エンタープライズ用途のCMSに至るまで様々なデフォルトプロジェクトも予め用意されており、30〜40個のアプリのどれをインストールして使えばよいか悩むこともありません。
今回は、Pinaxの全容を紹介します。
関連記事
Djangoのテンプレートは、{% extends "hoge.html" %}や{% include "hoge.html" %}などの
タグと{{hogevar}}の変数と定数文字列からなっています。
テンプレートを理解する上でもう一つ重要なのが、テンプレートのオーバーライドです。
テンプレートはある規則に従ってファイルシステム内を検索されます。
#正確には、templatedbなどのDBベースのテンプレートデータも存在していますが。
オーバーライドをマスターすると、アプリごとにHTMLを変更したいものだけ別ディレクトリで管理する
ことができるようになり、どれくらいの差分開発が発生したかを理解するのに役立ちます。
Djangoでは、モデルを定義するとそのままフォームを生成してくれる機能があります。
ModelFormという機能で、以下のように自動生成したいフォームクラスのメタクラスに、実際にデータが保存されるモデルクラス名を指定するだけです。
RDBの世界では、正規化の際にテーブルとテーブルの対応関係を定義することがあります。
Djangoが採用しているO/Rマッパの世界でもリレーションを定義することが可能で、以下2つの
メソッドが用意されています。
例として、Djangoの既存んモデルクラスであるUserを拡張する例を記述いたします。
django snippetsはDjangoのいろいろなアプリを
ソース付きで紹介しているサイトです。
このようなサイトはdjango以外でもなかなか無いと思いますので、貴重ですね〜。
関連記事
Djangoでは、モデルクラスからフォームクラスを生成する便利な機能を持っています。
フォームの値は大抵の場合、DBに保存することになるでしょうから、これは非常に便利だと思います。
関連記事
Djangoでドロップダウンメニューを作成する場合、ChoiceField()を使用すると思います。
関連記事
DjangoはMVC開発フレームワークとして有名ですが、Ruby on railsのようなアプリライブラリが
デフォルトではほとんど備わってません。そんなかゆいところにも手が届く系のツールを提供してくれるのが
「Pinax」です。
関連記事
Djangoでは、テンプレートファイル内に{{veriable}}と記述すると変数として扱われます。 これをハンドラ側(コントロール側)で定義することによって、様々な変数をマッピングできます。 最も簡単な例を以下に示しましょう。
関連記事
Djangoでモデルを定義しても、特段ユーザが明示しない限りインデックスが付与されることは ありません。インデックスがデフォルトで付与されているのは暗黙のカラムの「id」カラムだけです。
関連記事
先日DjangoでDBにアクセスするための基本設定 にてDBをDjangoから使用するための基本的設定を説明しました。今回は、実際に簡単なモデルを定義してみましょう。
関連記事
Djangoはそれ自体に簡易Webサーバを搭載しています。
しかしそれを使えるのはせいぜいプロトタイプ開発までで、実運用時はApacheなどの
本格的なサーバを使用することになります。Apacheからdjangoのハンドラ群を呼び出せるように
するための設定を以下に説明していきます。
DjangoはPythonベースのMVCモデルのWeb開発フレームワークです。
Django本家によると、
Djangoの特徴としては、以下が挙げられるようです。
表題で書いた問題をみなさん意識されたことはありますでしょうか?
通常system(cmd), popen(cmd)などを実行する際、コマンド文字列cmdを引数として渡して
実行していると思います。その場合、/bin/shシェルを経由して実行されるので
BeautifulSoupとは、HTML/SGML/XMLをパージングするPythonライブラリです。
ネーミングにセンスを感じさせるこのライブラリは、実用として考えても大変有用なライブラリです。
これを使い始めると、ありとあらゆるHTML/XMLをいじり倒したくなります。
タイムアウトという現象をよく自分のブラウザで見ることがあると思いますが、
これはブラウザ側で通信が時間内に完了しなかったために発生しているものであって、
サーバー側からエラーを送出しているわけではありません。
これをきちんと理解しておかないと、100MBのファイルをサーバーにCGI経由でアップロード
させようとしたらブラウザがタイムアウトとなってできません。。。
ということになってしまいます。
ですので、よくタイムアウトを理解する必要があります。
Posix準拠のプラットフォームではpthreadがサポートされています。
Pythonのスレッドはこのpthreadを使っているので、pthread環境下では
ネイティブスレッドを使用できます。当然Linux系の環境ならば使用可能です。
Pythonでのスレッド実装方針は大きく2つあります。
一つはthreading.Threadクラスをオーバーライドしてスレッド本体の実装を実現する方法で、
もう一つはスレッド実行したい関数をコールバック登録する方法です。
回は排他制御について説明しました。
Python: ファイルロックによる排他制御(fcntl編)
今回は排他制御を体感するためのサンプルソースを紹介します。
PythonでCGI実装していると、CGIからいろんな資源にアクセスすることになります。
RDBとかファイルとか。。。
RDBに対するR/Wは、RDB管理モジュールが同時書き込みに対する排他制御を行ってくれるので
何も意識することはありませんが、ファイルに対するR/Wとなるとそうはいきません。
ファイルで特に問題になるのは、書き込みです。
C言語では関数ポインタと引数を渡してコールバック関数を実現するなんてことが
よくありますよね。Pythonでもそれが可能で、要は可変個の引数の渡し方さえ
分かってしまえば簡単に実現可能です。
前回の記事で辞書配列、リストなどに対する基本的なソーティング方法を紹介しました。
Pythonでのソーティング方法(リスト、辞書配列・連想配列編)
今回は、もうちょっとこだわって、多次元配列(正確にはタプルのリスト)に対するソート方法を
紹介します。
Universal Feed Parser は、Pythonで簡単に
RSSを取得・パースするためのライブラリとして有名です。
RSSを取得するAPI自体も非常に簡素ですし、
Atom, RSS1.0, RSS2.0など本来XMLフォーマットが全く異なるものを統一的に扱うことができます。
Pythonで値付き引数(ex> --prefix "/hoge/path"など)を簡単に実現したいと思ったことは
ありませんか?そんなとき活躍するのがoptparseモジュールのOptionParserクラスです。
Pythonでソーティングをする方法を紹介します。
Pythonでソーティングと対象となるのはリスト型、配列型と辞書配列(連想配列)型です。
ですので、タプル型と集合型はソーティングすることはできません。
Pythonプログラム中から他のプログラムを実行する際最も簡単な方法は、
上記例のように、 os.system(cmd) を使用することです。
これは、os.system(cmd)を実行している親プロセスが子プロセスを同期実行(cmdによって実行
されたプロセスが終了するまで親プロセスも停止)することで実現しているのですが、
これでは、非同期実行もできませんし、cmdで実行された子プロセスの結果(標準出力、標準エラー出力)
も取得できません。
そんなときに使うとよいのが popen2 クラスです。
PIL記事シリーズも今回がひとまず最終回となります。
以前の記事は以下にありますので、よかったらご覧になられてみてください。
【PIL過去記事】
・
Python Image Library (PIL:画像編集ライブラリ)のインストール
・
PILにおけるファイル操作
・
PILのエフェクト関数
画像を拡大したり回転させたりするためには以下のような操作をすればOKです。
今回は前回の PILのインストール方法
に引き続き、PILの基本的な操作を説明していきたいと思います。
【PIL過去記事】
・
Python Image Library (PIL:画像編集ライブラリ)のインストール
Pythonで画像編集を行うなら、是非PILを使ってみてください。 Tkも使えるので、編集した画像を表示しながらプログラミングできます。 また、画像形式を自動的に判定してファイルオープンしてくれたり、 編集した画像を様々な画像形式で保存することも簡単にできます。
前回に引き続き、PILの基本操作を説明していきたいと思います。
PILの過去記事については以下をご参照ください。
【PIL過去記事】
・
Python Image Library (PIL:画像編集ライブラリ)のインストール
・
PILにおけるファイル操作
Pyblosxomでは、デフォルトの環境ではhead.html内で$title変数を使えないため、
エントリファイルで書いたタイトルを<head> ... </head>内の<title>タグ
に反映することができません。でも、タイトルはGoogleなどの検索エンジンにとっても
重要なファクターなので、ブロガーとしてはここは何とかしたいところです。
Webなどで日時情報(7月1日〜7月31日までなど)を表示するとき、月末日が
30日の月なのか、31日の月なのか?など計算に困ることがありますよね。
そんなとき、Pythonのtimeクラスを用いると簡単に月末日を求めることができます。
まずは、以下に例を記述します。
Pythonで文字定数の値を出力したいときは以下のようにすることで実現可能です。
C言語使ってゴリゴリの計算をするとき、時には高速化が必要になってきます。 そんなとき使うのがgprofですよね。これ常識。僕もこのツールのおかげで 半目でバシッと高速なプログラムを作成することができます。プログラムを改善する際、 このボトルネックをつぶすのがホント効率的なんですよね。最近僕はほぼWeb屋なので、 C言語だけでなく、スクリプト言語も使います。その中でpythonはケッコーなお気に入りなのですが、 このpythonにもプロファイリングツールがあります。 それが python-profiler です。
Pythonで開発されたブログシステム PyBlosxom をインストールしてみました。使い方は至って簡単。 インストールや設定についての説明は、英語ですが充実していますので、是非一度見てみましょう。
divタグとfloatを駆使すれば、PyBloxsomで簡単に3ペインが実現できます。
説明がめんどいので、大まかな方針だけを言うと、
divタグで3つのペインを作成し、それぞれのwidthを合計が98%未満になるようにします。
#これは、divのレイアウトくずれを防止するためです。
そんで、左と中央のdivを「float:left」、右側のdivを「float:right; clear: both;」
とすればOKです。
僕はよく自分が作ったシステムをいろんな所に売り込みに行く訳ですが、 出先でネットが使えない環境って多いですよね?(てか、ほとんど。) そんなこんなで困っていたときに出会ったソフトが「vnc2sw f.py」です。