Pythonプログラミング25: 英単語の頻度順
をみてちょっとやってみようと思ったのだけれど、単語のファイルを探すのが面倒なのでplanet pythonの記事の出現頻度を集めることにした。
今回は少し大きくなりそうなので、色々細かくわけて考える。
振る舞いを分割すると以下の通り
- planet pythonからhtmlを撮ってくる
- htmlをparseして記事の部分だけをとってくる
- 単語を出現頻度順に並べる
- 表示する。
まだ、pythonでwebからhtmlをとってくる方法も分かっていないのでそれを調べる。
webページからとってくる。
どうやら、urllibとurllib2があるらしい。python3のことを考えるとurllib2を使った方が良いと書いてあったのでurllib2を使ってみる。
ここで学んだこと
- url -> Request -> responceという流れでhtmlを取得する(urllib2)
- urllibだともっと楽っぽかった。
- urllib.retrieve(url,path)でDLできるみたい。
- printの改行を除去するには文末に","を付ける
code
htmlをparseする
HTML parser in Python - Stack OverflowでBeautifulSoupが薦められていた。これを使う。ドキュメントがしっかりしているらしい(http://www.crummy.com/software/BeautifulSoup/documentation.html)
ついでにタグの除去についても調べる。http://python.g.hatena.ne.jp/y_yanbe/20081025/1224910392を参考にした。
これを書いて学んだこと
- BeautifulSoupの使い方
- soup.find(tag, {attribute, value})という感じで探索する
- クラス定義の仕方
- __init__はコンストラクタ。利用時はKlass()
- generatorの使い方
- 型の調べ型
- isinstance(obj, class)
- (関係ないけれどNoneかどうか調べるにはisを使えば良いらしい)
- inはlispのmemqと考えると良さげ。
- encodeを指定しているところでasciiをそのまま表示しようとするとエラーを吐くっぽい。
- encode("utf-8")でエンコードしてあげる必要があったり。これ面倒だ。
- from <module> import <class> ...という書き方
code
改めて単語の出現頻度
前置詞とかが多くなるのは当然か。htmlを毎回とりにいくと遅延がうざったいので一度取ってきたらキャッシュすることにした。
% python wordhist.py
424: the
319: to
248: a
220: gt
218: and
181: of
136: in
129: that
127: is
...
32: use
32: python
32: have
32: like
31: end
31: true
31: november
...
これを書いて学んだこと
- ファイルの存在確認
- 文字列操作
- 文字列の分割:strにもsplitがあるけれど、re.split()を使う。
- 文字列の置換:re.subを使う。引数の関係が他の言語と逆
- 三項演算子の書き方
- pythonは独特 <success> if <pred> else <fail> という感じ
- 辞書を値にでソートした結果を取得。
- sortedを使う。
- reverse=Trueを渡すことで逆順にしてくれる。
- keyに比較関数を渡せる。
code
本当はこれらをsphinxを使ってまとめたい。
日記はupdateできないし。