<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Perl使いのPythonちゃん</title>
    <link rel="alternate" type="text/html" href="http://python.blog-slime.com/" />
    <link rel="self" type="application/atom+xml" href="http://python.blog-slime.com/atom.xml" />
    <id>tag:python.blog-slime.com,2008-04-30://1</id>
    <updated>2008-12-02T18:38:18Z</updated>
    <subtitle>Perlでガチガチの思考をPythonに置換するスクリプトブログ</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.1</generator>

<entry>
    <title>Python質問箱 - 投票はこちら</title>
    <link rel="alternate" type="text/html" href="http://python.blog-slime.com/2008/12/python.html" />
    <id>tag:python.blog-slime.com,2008://1.24</id>

    <published>2008-12-02T18:25:01Z</published>
    <updated>2008-12-02T18:38:18Z</updated>

    <summary>なんか、鯖移転後にめんどくさくなって、久々にページ見たら全然レイアウト崩れっぱな...</summary>
    <author>
        <name>admin</name>
        
    </author>
    
        <category term="Python質問箱" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="初心者" label="初心者" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="質問" label="質問" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://python.blog-slime.com/">
        <![CDATA[なんか、鯖移転後にめんどくさくなって、<div>久々にページ見たら全然レイアウト崩れっぱなしだし、<br />放置してる間に<a href="http://python.blog-slime.com/2007/07/beautifulsouphtml.html">BeautifulSoup</a>の解説で飛んでくる人が増加してるし。<div>いやらしく広告とか貼っといた。</div><div><br /></div><div>さて、Python使い始めて1年くらいになるけど、ほとんどPerlの使い方忘れてますｗ</div><div>ただこのタイトルはお気に入りなんで、このままにしよう。</div><div>近況は特に変化もなく、飽きずにPythonで遊んでます。</div><div>ひとまず、やりたい事は何とか出来るところまでは来たので</div><div>また隙を見て、いろいろ紹介していきます。</div><div><br /></div><div>また、Pythonで行き詰りそうな所の解説とかやってみようと思います。</div><div>Python初心者の方とか、分からないことあったらコメント欄で適当に質問してみてください。</div><div>僕の方が初心者である可能性が大ですが、分からないなりに</div><div>一生懸命 調べて解説したいと思ってます。</div></div>]]>
        
    </content>
</entry>

<entry>
    <title>ppkd(ppkf)を使って、文字エンコードを自動判別(文字エンコードについて)</title>
    <link rel="alternate" type="text/html" href="http://python.blog-slime.com/2007/10/ppkdppkf.html" />
    <id>tag:python.gantz.jp,2007://1.14</id>

    <published>2007-10-26T04:17:32Z</published>
    <updated>2008-04-30T03:41:38Z</updated>

    <summary>スクリプトを書く上で、日本語の扱いが最初のネックになる。 pythonは、基本U...</summary>
    <author>
        <name>admin</name>
        
    </author>
    
        <category term="便利ツール" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://python.blog-slime.com/">
        <![CDATA[<p>スクリプトを書く上で、日本語の扱いが最初のネックになる。</p>

<p>pythonは、基本UTF-8で書く事を推奨する。<br />
その場合にやらなければいけない設定は、過去にも取り上げた事がある。<br />
【<a href="http://python.blog-slime.com/2007/08/utf8.html">内部エンコーディングに使われるエンコードをUTF-8に設定...</a>】</p>

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

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

<div class="source"><pre>
print unicode(str)
# もしくは
print u"%s" % str
</pre></div>]]>
        <![CDATA[<p>ちなみに、Windowsのコマンドライン上で実行する場合は、<br />
Shift-JISにエンコードするとエラーになる時がある。<br />
詳しくは割愛させてもらうが、それを回避するためにはmbcsへエンコードが必要。</p>

<div class="source"><pre>
print unicode(str).encode('mbcs');
</pre></div>

<p>LINUX上では、mbcsは存在しないようで、Shift_JIS-2004になるっぽい。</p>

<div class="source"><pre>
print unicode(str).encode('shift_jis-2004')
</pre></div>

<p>ちなみに、日本語の文字エンコードを自動で判別するなら<br />
<a href="http://www.sitebites.homeip.net/projects/wiki/ProjectPpKd" target="_blank">ppkd(旧ppdf)</a>という非常に高性能なモジュールがある。<br />
使い方は以下の感じ。</p>

<div class="source"><pre>

<p>import ppkd</p>

<p>str = 'エンコードが何か分からない文字列'<br />
pkd = ppkd.ppkd()<br />
enc = pkd.guess(str)[1] # 文字エンコードを取得</p>

<p># SJISの場合は、'shift_jis'と返ってくるので、エンコードに使用する場合は<br />
# 自分の場合、下の様に変更を加えている。<br />
if enc == 'shift_jis': enc = 'shift_jis-2004' # Linuxの時<br />
if enc == 'shift_jis': enc = 'mbcs'             # コマンドプロンプトの時</p>

<p># utf-8にエンコード<br />
str = unicode(str, enc).encode('utf-8')<br />
</pre></div></p>

<p>Pythonで自動巡回等を行うなら、少々重さは感じるものの、必須になってくると思う。</p>]]>
    </content>
</entry>

<entry>
    <title>JTG - ipod・iTunes等、mp3プレイヤー用ジャケット画像簡単取得ツール</title>
    <link rel="alternate" type="text/html" href="http://python.blog-slime.com/2007/08/jtg-ipoditunesmp3.html" />
    <id>tag:python.gantz.jp,2007://1.13</id>

    <published>2007-08-25T03:10:09Z</published>
    <updated>2008-11-26T12:09:35Z</updated>

    <summary>Jack The Getter CDジャケット写真の画像簡単取得ツール GUIの...</summary>
    <author>
        <name>admin</name>
        
    </author>
    
        <category term="便利ツール" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://python.blog-slime.com/">
        <![CDATA[<h2>Jack The Getter</h2>
CDジャケット写真の画像簡単取得ツール

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

<p>ちなみに、起動時のアイテムチョイスは、作者の趣味です。</p>]]>
        <![CDATA[<p>バグなどは、コメントにて報告してもらえると喜びます。<br />
今後、暇を見て改良を重ねます。</p>

<h4>インストール</h4>

<p>Jack The Getter をダウンロードし、好きな所に解凍するだけ<br />
※VC++のライブラリが必要です。<br />
下からダウンロードしインストールしてください。<br />
今後.NET Framework Version 1.1 も必要になるかもしれません。</p>

<ul>
<li><a href="http://www.vector.co.jp/soft/win95/util/se435079.html" target="_blank">VC++ライブラリ</a></li>
<li><a href="http://python.blog-slime.com/pkg/dotnetfx.zip" target="_blank">.NET Framework Version 1.1 再頒布可能パッケージ</a></li>
</ul>

<p>■VC++ライブラリ インストール<br />
<a href="http://www.vector.co.jp/soft/win95/util/se435079.html" target="_blank">VC++ライブラリ</a>からダウンロードしたファイルを解凍するとdllフォルダが出てきます。<br />
「msvcp71.dll」のみをコピーし、Jack The Getterを解凍したフォルダにコピーします。</p>

<p>■NET Framework Version 1.1 インストール<br />
<a href="http://python.blog-slime.com/pkg/dotnetfx.zip" target="_blank">.NET Framework Version 1.1 再頒布可能パッケージ</a>をダウンロードし<br />
セットアップでインストールできます。</p>

<h4>使い方</h4>

<p>直感で分かると思いますが<br />
検索窓で、目的のアーティストか作品名を入力し<br />
検索ボタンを押せば、作品リストを取得してきます。</p>

<h4>ダウンロード</h4>

<p><strike>Jack The Getter</strike> 公開終了しました。</p>

<h4>更新履歴</h4>

<ul>
<li>08/25 とりあえず使用できる所まで完成</li>
</ul>]]>
    </content>
</entry>

<entry>
    <title>PythonでGoogleの表示順位を取得</title>
    <link rel="alternate" type="text/html" href="http://python.blog-slime.com/2007/08/pythongoogle.html" />
    <id>tag:python.gantz.jp,2007://1.12</id>

    <published>2007-08-02T09:53:00Z</published>
    <updated>2008-04-30T03:41:37Z</updated>

    <summary>単純なものとして、BeautifulSoupを使ったHTML解析で Google...</summary>
    <author>
        <name>admin</name>
        
    </author>
    
        <category term="BeautifulSoup" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="HTML解析" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="HTTPクライアント" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="htmllib" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="re" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="str" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="urllib" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="urllib2" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="サンプル集" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://python.blog-slime.com/">
        <![CDATA[<p>単純なものとして、BeautifulSoupを使ったHTML解析で<br />
Googleの表示順位を取得するスクリプトを作ってみた。</p>

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

<p>設定で指定した検索クエリ(q)を使用し、<br />
Googleで検索結果を取得。<br />
その中からURL(s)を発見したら表示するというもの。</p>]]>
        <![CDATA[<p><a href="http://python.blog-slime.com/mklib/google_search.txt">google_search.py</a></p>

<p>Windowsは、関連付けから起動すると<br />
処理が終了した時に窓が閉じてしまうので<br />
コマンドプロンプトから起動する。<br />
動体視力がよければ見えるかも？<br />
まぁテキストに吐き出せば済む事。</p>

<div class="source"><pre>

<p># -*- coding: utf-8 -*-<br />
#  Googleの表示順位を取得</p>

<p>import string, re, urllib, urllib2, urlparse, time<br />
from BeautifulSoup import BeautifulSoup</p>

<p>### 設定 #########################################################<br />
s = re.compile(r"^http://python.blog-slime.com/") # 順位を得るURL<br />
q = 'Perl使いのPythonちゃん' # 検索クエリ<br />
q = urllib.quote(q) # クエリをURLエンコード<br />
##################################################################</p>

<p>g = 'http://www.google.co.jp/search?hl=ja&num=100&q='</p>

<p># クライアントを生成<br />
opener = urllib2.build_opener()</p>

<p># PythonのUAがGoogleに弾かれているようなので変更<br />
opener.addheaders = [('User-Agent', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)')]</p>

<p>url = g + q # URLとクエリを連結<br />
print url</p>

<p>cnt = 0<br />
p = 1<br />
f = 0</p>

<p>while 1:<br />
  next = ""<br />
  <br />
  print str(p) + u"Page目"<br />
  <br />
  # Google検索結果を取得<br />
  html = opener.open(url).read()<br />
  <br />
  # HTMLソースをBeautifulSoupに渡す<br />
  # ※utf-8に変換される<br />
  soup = BeautifulSoup(html)<br />
  <br />
  # soup.findAll('a')で、Aタグのオブジェクト全てを取得<br />
  for obj in soup.findAll('a'):<br />
    # href属性でURLを取得<br />
    href = obj['href']<br />
    <br />
    # リンク文字を抜き出し、タグを削除して連結<br />
    cont = ''.join([str(t) for t in obj.contents[:]])<br />
    intext = re.sub("<[^>]*>", "", cont)<br />
    <br />
    # 次の検索結果へのリンクを取得<br />
    if intext == "次へ":<br />
      next = href<br />
    <br />
    # キャッシュとGoogle内のリンク、スポンサーリンクは除外<br />
    if None == re.search("^https?://[^\.]*\.?google\.co|^/", href) and intext != "キャッシュ":<br />
      cnt += 1<br />
      print u"  %d個目:" % cnt, unicode(intext).encode('mbcs')<br />
      <br />
      # 目的のURLを含むリンクを発見<br />
      if s.search(href):<br />
        print u"  発見"<br />
        print u"============= 検索結果 ============="<br />
        print "href : " + href<br />
        print "name : " + unicode(intext).encode('mbcs')<br />
        print "rank : %d" % cnt<br />
        print "===================================="<br />
        f = 1<br />
        break<br />
  <br />
  # 次へのリンクが存在しなければ終了<br />
  if next == "":<br />
    if f == 0:<br />
      print u"発見できませんでした"<br />
      print u"============= 検索結果 ============="<br />
      print u"圏外"<br />
      print "===================================="<br />
    break<br />
  else:<br />
    url = urlparse.urljoin(url, next)<br />
</pre></div></p>

<p>ちなみに、あまり多用し過ぎると<br />
Googleからスパム扱いされるので<br />
変な事には使わないように。。。</p>]]>
    </content>
</entry>

<entry>
    <title>内部エンコーディングに使われるエンコードをUTF-8に設定する方法。</title>
    <link rel="alternate" type="text/html" href="http://python.blog-slime.com/2007/08/utf8.html" />
    <id>tag:python.gantz.jp,2007://1.11</id>

    <published>2007-08-02T08:58:43Z</published>
    <updated>2008-04-30T03:41:37Z</updated>

    <summary>環境により違いがあるようだが、Pythonをインストールした 初期設定のままだと...</summary>
    <author>
        <name>admin</name>
        
    </author>
    
        <category term="BeautifulSoup" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Perl to Python" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Pythonインストール・初期設定" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://python.blog-slime.com/">
        <![CDATA[<p>環境により違いがあるようだが、Pythonをインストールした<br />
初期設定のままだと、'ascii'などが内部エンコーディングに使用されるようだ。</p>

<p>これにより、日本語の扱いで</p>

<div class="source"><pre>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinalnot in range(128)
</pre></div>

<p>などとエラーを吐く場合も多々あるので<br />
以下の箇所の設定を変更する必要がある。</p>]]>
        <![CDATA[<p>Python 2.4:<br />
"/Pythonをインストールしたディレクトリ"<br />
もしくは、<br />
"/Pythonをインストールしたディレクトリ/Lib"</p>

<p>Python 2.5の場合は<br />
"/Pythonをインストールしたディレクトリ/Lib"</p>

<p>以下に、/site-packagesというディレクトリが用意されている。<br />
そこに「sitecustomize.py」というファイルを作成し、<br />
テキストエディタで、</p>

<div class="source"><pre>
import sys
sys.setdefaultencoding('utf-8')
</pre></div>

<p>と編集すると、内部エンコーディングにutf-8を使用できる。<br />
文字エンコーディング等で詰まった場合は<br />
まずここを確認してみると良いだろう。</p>]]>
    </content>
</entry>

<entry>
    <title>Perlで言う、join関数が使い難い。</title>
    <link rel="alternate" type="text/html" href="http://python.blog-slime.com/2007/07/perljoin.html" />
    <id>tag:python.gantz.jp,2007://1.10</id>

    <published>2007-07-28T03:14:42Z</published>
    <updated>2008-04-30T03:41:37Z</updated>

    <summary>Perlでは、連結文字が「.」で、数値の乗算加算には「+」を用いるのに対し Py...</summary>
    <author>
        <name>admin</name>
        
    </author>
    
        <category term="Perl to Python" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="join" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="str" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://python.blog-slime.com/">
        <![CDATA[<p>Perlでは、連結文字が「.」で、数値の<del>乗算</del>加算には「+」を用いるのに対し<br />
Pythonでは、両方に「+」を用いることになる。<br />
これにより、数値を連結しようとすると<br />
必然的に、二つの数値の<del>積</del>和になってしまう訳だ。</p>

<div class="source"><pre>
>>> a = 1
>>> b = 2
>>> a + b
3
>>> # "ab"にはならない
</pre></div>

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

<div class="source"><pre>
>>> str(a)
"1"
</pre></div>

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

<p>例えば、以下の例でエラーメッセージに出くわす人も<br />
多いのではないだろうか（筆者もその一人）</p>]]>
        <![CDATA[<div class="source"><pre>
>>> a = ["abc", "def"]
</pre></div>

<p>この配列を連結させたい場合、Perlなら<br />
# join("", @a)だけでOK。<br />
Pythonの場合は「'連結文字'.join(配列)」の形。</p>

<div class="source"><pre>
>>> ''.join(a)
"abcdef"
</pre></div>

<p>となる。<br />
が、aの配列の値が数値で構成されている場合。<br />
もしくは配列の値に数値の型が含まれている場合。</p>

<div class="source"><pre>
>>> a = [1, 2, 3, 4]
>>> ''.join(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sequence item 0: expected string, int found
</pre></div>

<p>となる。<br />
要約すれば「文字列があるべきところに数値があるよ」ってこと。<br />
数値をjoinメソッドに渡す事はできない。<br />
ならば、数値を文字列に変換するstr()を使用する。</p>

<div class="source"><pre>
>>> ''.join(str(a))
"[1, 2, 3, 4]"
</pre></div>

<p>これでは駄目だ。<br />
配列の要素、一つ一つにstr()を行わなければならない。</p>

<p>Pythonには、内包表記というものがある。<br />
リストやタプルの中で、式やfor文を用い<br />
結果をリストやタプルの型で返すというもの。<br />
これを利用し、次のようにする。</p>

<div class="source"><pre>
>>> ''.join([str(t) for t in a])
"1234"
</pre></div>

<p>これが正規のやり方なのかは不明だが<br />
とりあえず、安全にかつ高速に使えるみたいだ。<br />
誰か、より良いやり方、関数があったら教えてください。</p>]]>
    </content>
</entry>

<entry>
    <title>BeautifulSoupでHTML解析</title>
    <link rel="alternate" type="text/html" href="http://python.blog-slime.com/2007/07/beautifulsouphtml.html" />
    <id>tag:python.gantz.jp,2007://1.9</id>

    <published>2007-07-27T05:00:38Z</published>
    <updated>2008-04-30T03:41:37Z</updated>

    <summary>BeautifulSoupが素晴らしいので 他にあまり解説サイトもないし、 簡単...</summary>
    <author>
        <name>admin</name>
        
    </author>
    
        <category term="BeautifulSoup" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="HTML解析" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="HTTPクライアント" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="re" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="urllib" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="urllib2" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://python.blog-slime.com/">
        <![CDATA[<p><a href="http://www.crummy.com/software/BeautifulSoup/" target="_blank" title="BeautifulSoup">BeautifulSoup</a>が素晴らしいので<br />
他にあまり解説サイトもないし、<br />
簡単に使えそうなものを羅列してみた。</p>

<p>ただし<a href="http://python.blog-slime.com/2007/08/utf8.html" title="内部エンコーディングに使われるエンコードをUTF-8に設定する方法">デフォルトエンコーディングを設定</a>している事が前提。</p>

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

<p>壊れたタグを修復という訳ではなさそうだが<br />
改行やインデントを作り直してくれる。<br />
Webアプリケーションとしても、かなり使えそう。</p>]]>
        <![CDATA[<div class="source"><pre>
# -*- coding: utf-8 -*-

<p>import string, re, urllib, urllib2<br />
from BeautifulSoup import BeautifulSoup</p>

<p>url = 'http://www.google.co.jp/search?hl=ja&num=100&q='<br />
# url = 'http://search.yahoo.co.jp/search?p=' # Yahooの場合</p>

<p># クライアントを生成<br />
opener = urllib2.build_opener()</p>

<p># PythonのUAがGoogleに弾かれているようなので変更<br />
opener.addheaders = [('User-Agent', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)')]</p>

<p>q = 'Perl使いのPythonちゃん' # 検索クエリ<br />
q = urllib.quote(q) # クエリをURLエンコード</p>

<p># Google検索結果を取得<br />
print url+q<br />
html = opener.open(url+q).read()</p>

<p># HTMLソースをBeautifulSoupに渡す<br />
soup = BeautifulSoup(html)</p>

<p># エンコーディングを自動で取得<br />
enc = soup.originalEncoding<br />
print "Encoding : %s" % enc</p>

<p># ソースを出力<br />
# ※unicode(text, 'utf-8')はutf-8の文字をunicodeに変換<br />
# print unicode(soup.prettify(), enc)</p>

<p># ※UnicodeEncodeError: 'cp932' codec can't encode character...は、<br />
#   Windowsの拡張文字でエラーが起こっているのかも。<br />
#   その場合は'mbcs'というCodecを使う<br />
#print unicode(soup.prettify(), enc).encode('mbcs')</p>

<p>### タグへのアクセス方法 - 1 (DOMもどきな扱い方)<br />
print u'DOMもどきな扱い方'</p>

<p># contents[0]で、その階層の1番上の要素にアクセス<br />
# .name で、要素のタグ名を取得(小文字)<br />
print soup.contents[0].name<br />
# 結果はu'html'となる</p>

<p># 更に子となる要素へアクセス(結果 : u'head')<br />
print soup.contents[0].contents[0].name</p>

<p># 要素を変数に格納<br />
head = soup.contents[0].contents[0]</p>

<p># 親要素にアクセス(結果 : u'html')<br />
print head.parent.name</p>

<p># 自分を含む、それ以下の階層の次の要素にアクセス(結果 : u'meta')<br />
print head.next.name</p>

<p># 同階層の次の要素にアクセス(結果 : u'body')<br />
print head.nextSibling.name</p>

<p># 複合(結果 : u'table')<br />
print head.nextSibling.contents[0].name<br />
# 複合(結果 : u'blockquote')<br />
print head.nextSibling.contents[0].nextSibling.name</p>

<p>### タグへのアクセス方法 - 2 (よりDOMっぽい扱い方)</p>

<p>print u'DOMもどきな扱い方'</p>

<p># タグ名でアクセス<br />
titleTag = soup.html.head.title</p>

<p># そのまま出力するとタグごと表示<br />
print u"%s" % titleTag</p>

<p># string でinnerText<br />
print u"%s" % titleTag.string</p>

<p># 要素数を取得<br />
print len(soup('font'))</p>

<p># 一致したタグの一番目を返す(属性で絞込みもできる)<br />
soup.find('a')</p>

<p># 一致したタグをリストにして返す(属性で絞込みもできる)<br />
print soup.findAll('a', href="/")</p>

<p># 正規表現さえ使える<br />
print soup.find('a', href=re.compile('^/'))</p>

<p># リストとしてアクセスも可能<br />
print soup('a', href=re.compile('^/'))[1]</p>

<p># 要素の値を返す<br />
print soup('a', href=re.compile('^/'))[0]['href']</p>

<p># 覚書 : xmlを解析する場合はBeautifulStoneSoup(xml)を使う？(未確認)</p>

</pre></div>

<p>DOMのような感じで、置き換えたりタグを生成したりも<br />
できるようだが、現状では必要ないのでまた今度。</p>

<p>ようし、飽きた！<br />
これらを駆使してサンプルでも作ってみる。</p>]]>
    </content>
</entry>

<entry>
    <title>PythonでHTML解析(HTMLParserより優れたパーサ)</title>
    <link rel="alternate" type="text/html" href="http://python.blog-slime.com/2007/07/pythonhtmlhtmlparser.html" />
    <id>tag:python.gantz.jp,2007://1.8</id>

    <published>2007-07-27T02:04:34Z</published>
    <updated>2008-04-30T03:41:37Z</updated>

    <summary>HTTPクライアントを作成するにあたり、 HTML解析周りが一番の難点となるのだ...</summary>
    <author>
        <name>admin</name>
        
    </author>
    
        <category term="BeautifulSoup" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="HTMLParser" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="HTML解析" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="HTTPクライアント" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="htmllib" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://python.blog-slime.com/">
        <![CDATA[<p>HTTPクライアントを作成するにあたり、<br />
HTML解析周りが一番の難点となるのだが、<br />
Pythonの標準ライブラリ(htmllib, HTMLParserなど)では、<br />
壊れたHTMLを解析できないということなので<br />
<a href="http://www.crummy.com/software/BeautifulSoup/" target="_blank" title="BeautifulSoup">BeautifulSoup</a>を試してみることに。</p>

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

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

<p>インストール方法<br />
<a href="http://www.crummy.com/software/BeautifulSoup/" target="_blank" title="BeautifulSoup">BeautifulSoup</a>をダウンロード。<br />
スクリプトのあるディレクトリ、もしくは<br />
「Pythonのルートディレクトリ/Lib」に保存するだけ。</p>

<p>さて、本格的な使い方を追求してみようと思う。</p>]]>
        
    </content>
</entry>

<entry>
    <title>【対話型 Python】なあ、俺って結構イケてる？</title>
    <link rel="alternate" type="text/html" href="http://python.blog-slime.com/2007/07/-python.html" />
    <id>tag:python.gantz.jp,2007://1.7</id>

    <published>2007-07-26T11:03:48Z</published>
    <updated>2008-04-30T03:41:37Z</updated>

    <summary>関係ないけど、おもしろかったから覚書。...</summary>
    <author>
        <name>admin</name>
        
    </author>
    
        <category term="雑記" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://python.blog-slime.com/">
        <![CDATA[<p>関係ないけど、おもしろかったから覚書。</p>]]>
        <![CDATA[<div class="source"><pre>
>>> [  'A'] < "なあ、俺って結構イケてる？" 
True 
>>> [  'A'] < "え、マジで？" 
True 
>>> [  'A'] < "・・・・・" 
True 
>>> [  'A'] < "あー" 
True 
>>> [  'A'] < "俺、逝ってよし？" 
True 
>>> [  'A'] 
['A'] 
</pre></div>]]>
    </content>
</entry>

<entry>
    <title>cookielibでCookieが保持できずログインできない</title>
    <link rel="alternate" type="text/html" href="http://python.blog-slime.com/2007/07/cookielibcookie.html" />
    <id>tag:python.gantz.jp,2007://1.6</id>

    <published>2007-07-26T01:31:32Z</published>
    <updated>2008-04-30T03:41:37Z</updated>

    <summary>urllib2, cookielibを使用し、某管理画面にログインするが セッシ...</summary>
    <author>
        <name>admin</name>
        
    </author>
    
        <category term="HTTPクライアント" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="httplib" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="re" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="urllib" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://python.blog-slime.com/">
        <![CDATA[<p>urllib2, cookielibを使用し、某管理画面にログインするが<br />
セッションが保持できず、格闘すること数日。。。<br />
苦戦した末、やっと行き着いた答えは<br />
ヘッダが足りなかった事。。。。</p>

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

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

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

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

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

<p>以下が、そのスクリプト。</p>]]>
        <![CDATA[<p>amazonはPOST後にリダイレクトはないが<br />
ログイン等でリダイレクトさせられる場合は、<br />
r.getheader('Location')で、リダイレクト先のURLを<br />
取得し、更にGETでリクエストしなくてはならない。</p>

<p>面倒だが、自動で飛んでしまうより便利だと思う。</p>

<div class="source"><pre>
# -*- coding: utf-8 -*-

<p>import urllib, httplib, re</p>

<p>host = 'www.amazon.co.jp'<br />
path = '/s/'</p>

<p>postdata = {}<br />
postdata['__mk_ja_JP'] = 'カタカナ'<br />
postdata['initialSearch'] = 1<br />
postdata['url'] = 'search-alias'<br />
postdata['field-keywords'] = 'python'<br />
postdata['Go'] = 'Go'</p>

<p># PostするデータをURLエンコード<br />
params = urllib.urlencode(postdata)</p>

<p># RequestするHeaderを辞書に定義<br />
headers = {<br />
	"Content-type": "application/x-www-form-urlencoded",<br />
	'Connection': 'keep-alive',<br />
	"Accept": "text/plain"<br />
}</p>

<p># サーバに接続<br />
con = httplib.HTTPConnection(host)</p>

<p># パラメタとヘッダを持って、リクエスト1回目<br />
con.request("POST", path, params, headers)<br />
r = con.getresponse()</p>

<p># ソースを取得(接続は閉じない)<br />
r.read()</p>

<p># クッキーを取得(超適当)<br />
c = r.getheader('Set-Cookie')<br />
c = re.sub(";.*", "", c)</p>

<p># リダイレクトされる場合にはpathをリダイレクト先に変更<br />
# path = r.getheader('Location')</p>

<p># クッキーをヘッダにセット<br />
headers = {<br />
	"Content-type": "application/x-www-form-urlencoded",<br />
	'Connection': 'keep-alive',<br />
	'Cookie': c,<br />
	"Accept": "text/plain"<br />
}</p>

<p># 接続を保ったまま、2度目のリクエスト<br />
con.request("POST", path, params, headers)<br />
r = con.getresponse()</p>

<p># ソースを表示<br />
print r.read()</p>

<p># 接続を解除<br />
r.close()</p>

</pre></div>]]>
    </content>
</entry>

<entry>
    <title>PythonでHTTPクライアント(Cookie保持)</title>
    <link rel="alternate" type="text/html" href="http://python.blog-slime.com/2007/07/pythonhttpcookie.html" />
    <id>tag:python.gantz.jp,2007://1.5</id>

    <published>2007-07-25T09:49:54Z</published>
    <updated>2008-04-30T03:41:37Z</updated>

    <summary>cookielibというモジュールを使うと良いらしいが 同梱されるのは、pyth...</summary>
    <author>
        <name>admin</name>
        
    </author>
    
        <category term="HTTPクライアント" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="cookielib" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="urllib" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="urllib2" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://python.blog-slime.com/">
        <![CDATA[<p>cookielibというモジュールを使うと良いらしいが<br />
同梱されるのは、python2.4からだそうだ。<br />
<a href="http://www.python.jp/Zope/download/pythoncore" target="_blank">日本Pythonユーザ会</a>から最新版をダウンロードし、アップデートしてみた。<br />
いちいちパスを通しなおすのが面倒なので<br />
インストール先はC:\Python</p>

<p>現時点では、日本語環境対応版が無いようだ。と思ったが<br />
2.4以降くらいから標準で日本語にも対応しているらしい。</p>

<p>ちなみにリダイレクト(Location:)は、勝手にやってしまうみたいなので注意。</p>

<p>やり方的には、次の通りで一応できた。</p>]]>
        <![CDATA[<div class="source"><pre>
# -*- coding: utf-8 -*-

<p>import urllib, urllib2, cookielib</p>

<p>url = 'http://www.amazon.co.jp/s/'</p>

<p>postdata = {}<br />
postdata['__mk_ja_JP'] = 'カタカナ'<br />
postdata['initialSearch'] = 1<br />
postdata['url'] = 'search-alias'<br />
postdata['field-keywords'] = 'python'<br />
postdata['Go'] = 'Go'</p>

<p>params = urllib.urlencode(postdata)<br />
cj = cookielib.CookieJar()<br />
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))<br />
# UserAgent を設定<br />
opener.addheaders = [('User-agent', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)')]<br />
r = opener.open(url, params)<br />
print r.geturl()<br />
print r.read()<br />
r.close()</p>

</pre></div>

<p>urllib.urlencode で、POST時のパラメタをURLエンコード<br />
cookielib.CookieJar()で、生成したcjをHTTPCookieProcessorに渡し<br />
urllib2のbuild_openerでHTTPクライアントを作るみたいな感じかな。<br />
openerが、PerlでいうUserAgentの役割になるようだ。</p>

<p>あとは、それを使いリクエストするだけ。</p>

<p>mixiなんかにはログインする事ができたが<br />
私がログインしたいサイトではセッション切れを起こす。。</p>

<p>便利すぎて挙動が分からないので<br />
別な方法を考えてみる。</p>]]>
    </content>
</entry>

<entry>
    <title>cookieの利用</title>
    <link rel="alternate" type="text/html" href="http://python.blog-slime.com/2007/07/cookie.html" />
    <id>tag:python.gantz.jp,2007://1.4</id>

    <published>2007-07-22T06:25:32Z</published>
    <updated>2008-04-30T03:41:37Z</updated>

    <summary>PerlのHTTP::Cookiesのような便利なモジュールはないものか。 ログ...</summary>
    <author>
        <name>admin</name>
        
    </author>
    
        <category term="HTTPクライアント" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://python.blog-slime.com/">
        <![CDATA[<p>PerlのHTTP::Cookiesのような便利なモジュールはないものか。</p>

<p>ログイン情報をPOSTで送信することできても<br />
その情報をクッキーに保持することができない。</p>

<p>未だ探索中。</p>

<p>見つかれば、時節で取り上げる。</p>]]>
        
    </content>
</entry>

<entry>
    <title>urllibを使ってPOST送信</title>
    <link rel="alternate" type="text/html" href="http://python.blog-slime.com/2007/07/urllibpost.html" />
    <id>tag:python.gantz.jp,2007://1.3</id>

    <published>2007-07-22T04:36:12Z</published>
    <updated>2008-04-30T03:41:37Z</updated>

    <summary>POSTする事自体は結構簡単っぽい。 urllibをimportしてエンコードし...</summary>
    <author>
        <name>admin</name>
        
    </author>
    
        <category term="HTTPクライアント" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="urllib" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://python.blog-slime.com/">
        <![CDATA[<p>POSTする事自体は結構簡単っぽい。</p>

<p>urllibをimportしてエンコードしたパラメタを持ってリクエスト。</p>]]>
        <![CDATA[<div class="source"><pre>
# -*- coding: utf-8 -*-<br />
# ↑utf-8 でコーディングする時に宣言

<p>import urllib</p>

<p>def post(url):<br />
  # パラメタのハッシュを作成（pythonでは辞書と呼ぶらしい）<br />
  # ※キーをnameとして、値にvalueとしたいものをセット<br />
  postdata = {}<br />
  postdata['__mk_ja_JP'] = 'カタカナ'<br />
  postdata['initialSearch'] = 1<br />
  postdata['url'] = 'search-alias'<br />
  postdata['field-keywords'] = 'python'<br />
  postdata['Go'] = 'Go'<br />
  <br />
  params = urllib.urlencode(postdata) # URLエンコード<br />
  up = urllib.urlopen(url, params)    # (アクション先, パラメタの辞書)としてリクエストするだけ<br />
  print up.read()                     # オブジェクトに対してread()で、ソースを取得</p>

<p>post('http://www.amazon.co.jp/s/')<br />
</pre></div></p>

<p>ただし、クッキーが保持できないので<br />
次はそれが課題。</p>]]>
    </content>
</entry>

<entry>
    <title>PerlからPythonに移行</title>
    <link rel="alternate" type="text/html" href="http://python.blog-slime.com/2007/07/perlpython.html" />
    <id>tag:python.gantz.jp,2007://1.2</id>

    <published>2007-07-22T04:27:47Z</published>
    <updated>2008-04-30T03:41:37Z</updated>

    <summary>perlを使って、いろいろやったけど 結局スレッド関係で行き詰まり、何故かRub...</summary>
    <author>
        <name>admin</name>
        
    </author>
    
        <category term="雑記" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://python.blog-slime.com/">
        <![CDATA[<p>perlを使って、いろいろやったけど<br />
結局スレッド関係で行き詰まり、何故かRubyではなく<br />
Pythonへ移行するつもり。</p>

<p>とりあえずは、POST操作ができるまで試み中。</p>]]>
        
    </content>
</entry>

</feed>

