"python" カテゴリのページ

Python: lxmlを使って、タグを巡回する方法

HTMLの分析を行う際、タグを巡回する必要がありますがそんなとき、lxmlを使うと便利です。

lxmlでは、タグの入れ子関係が壊れたHTMLの修復も自動で行ってくれる機能がありますのでユーザは細かいことを気にする必要はありません。この修復機能のおかげで、入れ子の修復(閉じ括弧がないタグは閉じ括弧を付与)を行ってくれるため、HTMLをツリーとして、つまりDOMツリーとして捉えることができるようになるのです。

DOMツリーだから何やねん!という方は読み飛ばしてもらっていいのですが、ツリーであるおかげで親ノード(親タグ)をたぐったり、兄弟ノード(兄弟タグ)をたぐったりが簡単にできるようになるのですね。lxmlってすばらしい。

木を巡回する手法はいろいろとありますが、今日は深さ優先で巡回する手法をみてみましょう。

Python: lxml.htmlを用いたタグの除去方法

lxmlを使えば、タグの除去も超簡単です!

tostring()もしくはXPathを使ってできるのですね〜。

Python: lxmlの文字コード(tostring())

lxmlは文字コードを厳格に定義しており、入力時は必ず「unicode」化しておく必要があります。

これだけでも注意しておかなければならない点ですが、lxmlには、出力用の「tostring()」というメソッドを持っており、ここでも文字コードの注意が必要となってきます。

Python: lxmlを使って高速にaタグを取得する方法

PythonでXML/HTMLをパースする場合、

 

  • SAXベースのlxml

の大きく2つが存在しています。

前者は以前このブログでも紹介していますので、ご覧下さい。DOMベースなので気軽にパース処理することができる反面、少々処理が重いです。

一方後者は、XPATHと呼ばれる問い合わせ言語(まぁ、SQLのようなもんです)をある程度理解する必要はありますが、メモリもそんなに使わず大変高速なため、phactoryではよく使っています。

今日はこのlxmlを使ってタグ抽出する方法を紹介します。

PythonでHTTP通信のレスポンスコードを取得する方法

2012/02/18

pythonでHTTP通信する場合、urllib, urllib2あたりを使うことが多いと思います。

手軽で簡単ではあるのですが、どちらもレスポンスコードを取得することができません。

 

  • urllibについては、python2.6以上であれば、urlopen().getcode()メソッドでサポートされているが、それ以前のバージョンではサポートされていない。
  • urllib2では、2xx系以外は例外が発生するためレスポンスコード取得できない。

 

「レスポンスコードをどうしても取得したい!」という場合は、httplibを使いましょう。

django evolutionを用いて、モデル定義の変更・削除に対応する

Djangoは、クラス定義(モデル)とデータベーステーブルとを関連付けるORM(Object-Relation Model)というフレームワークを採用しています。そのため、SQLやRDBのことが分からなくても、Python & Djangoの知識だけである程度データベースを利用することができます。

データベースとしては、PostgreSQL / MYSQL / Sqlite などが利用可能ですが、これらすべてが既存のテーブルに対して、カラムの追加・変更・削除処理をサポートしている訳ではありません。例えば、PostgreSQLはカラムの追加はできますが、変更(型や名前の変更など)はできません。

これらは、サポートしているデータベースが提供しているサービスで、共通部分のみしか使わないというDjangoの思想に基づいています。なので、モデル定義の変更・削除も同様に、

    $ python manage.py syncdb

では対応できないのです。

これを解決するためのDjangoアプリケーションがあります。
django-evolution」です。
これを使えば、モデルの変更・削除が実現できます。

Pinax0.7.1のインストール方法

今回は、Pinaxのインストール方法について説明します。Pinaxのインストールは前バージョンである0.5.1から大きく様変わりしています。前回までは、Pinax自体のパッケージをPythonパスの通ったところに配置するだけでよかったのですが、今回はインストーラが附属していたり、Pinaxが動作するために必要な外部パッケージ(Djangoなど)も同時にインストールされるようになっています。

Djangoのアプリ集「Pinax」

2010/02/16

Pinaxは、Djangoフレームワークで実装されたアプリケーション集です。

デフォルトのテンプレートも最初から提供されているため素早くサイトを立ち上げることが可能です。

用途に応じて、個人のブログサイトやコーポレートサイト、エンタープライズ用途のCMSに至るまで様々なデフォルトプロジェクトも予め用意されており、30〜40個のアプリのどれをインストールして使えばよいか悩むこともありません。

今回は、Pinaxの全容を紹介します。

Django: Adminページのカスタマイズ方法

関連記事



前回、テンプレートの検索順序とオーバーライド方法について説明しました。
今回はこの仕組みを利用してAdminサイトの見栄えを変更する方法を説明します。

Django: テンプレートの検索順序とオーバーライド

Djangoのテンプレートは、{% extends "hoge.html" %}や{% include "hoge.html" %}などの タグと{{hogevar}}の変数と定数文字列からなっています。

テンプレートを理解する上でもう一つ重要なのが、テンプレートのオーバーライドです。 テンプレートはある規則に従ってファイルシステム内を検索されます。
#正確には、templatedbなどのDBベースのテンプレートデータも存在していますが。
オーバーライドをマスターすると、アプリごとにHTMLを変更したいものだけ別ディレクトリで管理する ことができるようになり、どれくらいの差分開発が発生したかを理解するのに役立ちます。

Django: モデルクラスから自動的にフォームクラスを生成する方法

Djangoでは、モデルを定義するとそのままフォームを生成してくれる機能があります。
ModelFormという機能で、以下のように自動生成したいフォームクラスのメタクラスに、実際にデータが保存されるモデルクラス名を指定するだけです。

Django: モデル間のリレーションを定義する方法

RDBの世界では、正規化の際にテーブルとテーブルの対応関係を定義することがあります。 Djangoが採用しているO/Rマッパの世界でもリレーションを定義することが可能で、以下2つの メソッドが用意されています。

例として、Djangoの既存んモデルクラスであるUserを拡張する例を記述いたします。

Djangoのサンプルソース集を集めたサイト「django snippets」

django snippetsはDjangoのいろいろなアプリを ソース付きで紹介しているサイトです。 このようなサイトはdjango以外でもなかなか無いと思いますので、貴重ですね〜。

ありがたや。ありがたや。

Python: DjangoをApacheから呼び出せるようにする方法

関連記事



Djangoはそれ自体に簡易Webサーバを搭載しています。
しかしそれを使えるのはせいぜいプロトタイプ開発までで、実運用時はApacheなどの 本格的なサーバを使用することになります。Apacheからdjangoのハンドラ群を呼び出せるように するための設定を以下に説明していきます。

PythonベースのWeb開発フレームワーク:Django

2010/02/14

DjangoはPythonベースのMVCモデルのWeb開発フレームワークです。
Django本家によると、 Djangoの特徴としては、以下が挙げられるようです。

Python: Django1.0(Postgresql, psycopg)をMacOSXにインストールする方法

Djangoは、PythonでMVC開発するためのWeb開発フレームワークです。
いわばRuby on RailsのPython版といったところでしょうか。

 ・ Django日本版
 ・ Django本家

これをMacにインストールするためには、
Django、RDBモジュール(Postgresql, MySQLなど)、psycopgなどのPython-RDB間を つなぐI/Fモジュールが必要です。

Python: system()やpopen()系で実行したプロセスは自分の孫プロセスになる?

表題で書いた問題をみなさん意識されたことはありますでしょうか?
通常system(cmd), popen(cmd)などを実行する際、コマンド文字列cmdを引数として渡して 実行していると思います。その場合、/bin/shシェルを経由して実行されるので

実行プロセス -> /bin/sh -> cmdプロセス

という関係になります。
この場合、実行プロセスからcmdプロセスのpidを取得することは出来ません。 なので、cmdプロセスをコントロール(終了させたり)するのが難しくなります。

Python: BeautifulSoupで、HTML/XMLをらくらくパージング

BeautifulSoupとは、HTML/SGML/XMLをパージングするPythonライブラリです。 ネーミングにセンスを感じさせるこのライブラリは、実用として考えても大変有用なライブラリです。 これを使い始めると、ありとあらゆるHTML/XMLをいじり倒したくなります。

Webサーバー側でタイムアウト後にプロセスを停止させる方法

タイムアウトという現象をよく自分のブラウザで見ることがあると思いますが、 これはブラウザ側で通信が時間内に完了しなかったために発生しているものであって、 サーバー側からエラーを送出しているわけではありません。
これをきちんと理解しておかないと、100MBのファイルをサーバーにCGI経由でアップロード させようとしたらブラウザがタイムアウトとなってできません。。。 ということになってしまいます。

ですので、よくタイムアウトを理解する必要があります。

Pythonでのスレッドの使い方(サンプルソース)

Posix準拠のプラットフォームではpthreadがサポートされています。 Pythonのスレッドはこのpthreadを使っているので、pthread環境下では ネイティブスレッドを使用できます。当然Linux系の環境ならば使用可能です。

Pythonでのスレッド実装方針は大きく2つあります。
一つはthreading.Threadクラスをオーバーライドしてスレッド本体の実装を実現する方法で、 もう一つはスレッド実行したい関数をコールバック登録する方法です。

Python: ファイルロックによる排他制御(サンプルソース)

回は排他制御について説明しました。
Python: ファイルロックによる排他制御(fcntl編)

今回は排他制御を体感するためのサンプルソースを紹介します。

Python: ファイルロックによる排他制御(fcntl編)

PythonでCGI実装していると、CGIからいろんな資源にアクセスすることになります。
RDBとかファイルとか。。。
RDBに対するR/Wは、RDB管理モジュールが同時書き込みに対する排他制御を行ってくれるので 何も意識することはありませんが、ファイルに対するR/Wとなるとそうはいきません。

ファイルで特に問題になるのは、書き込みです。

Python: 関数ポインタの渡し方(汎用ハンドラの作成法)

C言語では関数ポインタと引数を渡してコールバック関数を実現するなんてことが よくありますよね。Pythonでもそれが可能で、要は可変個の引数の渡し方さえ 分かってしまえば簡単に実現可能です。

Python:多次元配列(タプルの配列)のソート方法

前回の記事で辞書配列、リストなどに対する基本的なソーティング方法を紹介しました。
Pythonでのソーティング方法(リスト、辞書配列・連想配列編)

今回は、もうちょっとこだわって、多次元配列(正確にはタプルのリスト)に対するソート方法を 紹介します。

Pythonで簡単にRSSを取得・パース可能なライブラリ:feedparser

Universal Feed Parser は、Pythonで簡単に RSSを取得・パースするためのライブラリとして有名です。
RSSを取得するAPI自体も非常に簡素ですし、 Atom, RSS1.0, RSS2.0など本来XMLフォーマットが全く異なるものを統一的に扱うことができます。

Pythonで簡単にコマンドライン引数をパースする方法(optparse.OptionParser編)

Pythonで値付き引数(ex> --prefix "/hoge/path"など)を簡単に実現したいと思ったことは ありませんか?そんなとき活躍するのがoptparseモジュールのOptionParserクラスです。

Pythonでのランダムな整数値の作り方 ( rondom.randint() )

Pythonでランダムな値を生成するのは非常に簡単です。

Pythonでのソーティング方法(リスト、辞書配列・連想配列編)

Pythonでソーティングをする方法を紹介します。
Pythonでソーティングと対象となるのはリスト型、配列型と辞書配列(連想配列)型です。
ですので、タプル型と集合型はソーティングすることはできません。

Python: popen2を用いた子プロセスの生成方法(Popen3/4, popen3/4メソッドの違いについて)

Pythonプログラム中から他のプログラムを実行する際最も簡単な方法は、

 import os  os.system("ls")

上記例のように、 os.system(cmd) を使用することです。
これは、os.system(cmd)を実行している親プロセスが子プロセスを同期実行(cmdによって実行 されたプロセスが終了するまで親プロセスも停止)することで実現しているのですが、 これでは、非同期実行もできませんし、cmdで実行された子プロセスの結果(標準出力、標準エラー出力) も取得できません。

そんなときに使うとよいのが popen2 クラスです。

Python Image Library (PIL:画像処理ライブラリ)の使い方(画像編集・データ操作編)

PIL記事シリーズも今回がひとまず最終回となります。
以前の記事は以下にありますので、よかったらご覧になられてみてください。
【PIL過去記事】
Python Image Library (PIL:画像編集ライブラリ)のインストール
PILにおけるファイル操作
PILのエフェクト関数

・画像編集操作

画像を拡大したり回転させたりするためには以下のような操作をすればOKです。

import Image im = Image.open("hoge.gif") size = (64, 64) im.resize(size, NEAREST) im.rotate(45)

Python Image Library (PIL:画像編集ライブラリ)のDebianへのインストール

Pythonで画像編集を行うなら、是非PILを使ってみてください。 Tkも使えるので、編集した画像を表示しながらプログラミングできます。 また、画像形式を自動的に判定してファイルオープンしてくれたり、 編集した画像を様々な画像形式で保存することも簡単にできます。

Python Image Library (PIL:画像処理ライブラリ)の使い方(エフェクト編)

前回に引き続き、PILの基本操作を説明していきたいと思います。
PILの過去記事については以下をご参照ください。

【PIL過去記事】
Python Image Library (PIL:画像編集ライブラリ)のインストール
PILにおけるファイル操作

Pyblosxomで各エントリにエントリタイトルを表示させる方法

Pyblosxomでは、デフォルトの環境ではhead.html内で$title変数を使えないため、 エントリファイルで書いたタイトルを<head> ... </head>内の<title&gtタグ に反映することができません。でも、タイトルはGoogleなどの検索エンジンにとっても 重要なファクターなので、ブロガーとしてはここは何とかしたいところです。

Pythonでうるう年や月末日(28日/30日/31日)を簡単に求める方法

Webなどで日時情報(7月1日〜7月31日までなど)を表示するとき、月末日が 30日の月なのか、31日の月なのか?など計算に困ることがありますよね。 そんなとき、Pythonのtimeクラスを用いると簡単に月末日を求めることができます。
まずは、以下に例を記述します。

Pythonでの文字コードでのノウハウ

Pythonで文字定数の値を出力したいときは以下のようにすることで実現可能です。

In [6]: print ord(" ")
32

In [7]: print ord("a")
97

pythonのプロファイラ:python-profiler

C言語使ってゴリゴリの計算をするとき、時には高速化が必要になってきます。 そんなとき使うのがgprofですよね。これ常識。僕もこのツールのおかげで 半目でバシッと高速なプログラムを作成することができます。プログラムを改善する際、 このボトルネックをつぶすのがホント効率的なんですよね。最近僕はほぼWeb屋なので、 C言語だけでなく、スクリプト言語も使います。その中でpythonはケッコーなお気に入りなのですが、 このpythonにもプロファイリングツールがあります。 それが python-profiler です。

PyBlosxomにRSSを追加する方法

2010/02/14

PyBlosxomにRSS/RSS2.0/ATOMを貼り付ける方法は、非常に簡単です。

PyBlosxom始めました。

2010/02/14

Pythonで開発されたブログシステム PyBlosxom をインストールしてみました。使い方は至って簡単。 インストールや設定についての説明は、英語ですが充実していますので、是非一度見てみましょう。

PyBloxsomでdivによる3ペイン構成を実現する方法

2010/02/14

divタグとfloatを駆使すれば、PyBloxsomで簡単に3ペインが実現できます。
説明がめんどいので、大まかな方針だけを言うと、
divタグで3つのペインを作成し、それぞれのwidthを合計が98%未満になるようにします。
#これは、divのレイアウトくずれを防止するためです。
そんで、左と中央のdivを「float:left」、右側のdivを「float:right; clear: both;」
とすればOKです。

vnc2swf.py: swf形式で画面をキャプチャするソフトのインストール方法

僕はよく自分が作ったシステムをいろんな所に売り込みに行く訳ですが、 出先でネットが使えない環境って多いですよね?(てか、ほとんど。) そんなこんなで困っていたときに出会ったソフトが「vnc2sw f.py」です。

カテゴリー