webから情報拾ってくるところは後にして、メールを投げるpythonスクリプトは以下でいけそう。日本語について何も考えて無いのでちゃんと調べないといかんけど。
import smtplib server = "192.168.99.99" # smtpサーバのホスト名 from_addr = "xxx@from.com" to_addr = "xxx@to.com" msg = ("From: %s\r\nTo: %s\r\n\r\n" % (from_addr, to_addr)) + "contents" smtpserv = smtplib.SMTP(server) smtp.sendmail(from_addr, to_addr, msg);
まぁpythonのライブラリリファレンスのまんま。定期的に送るのはcronを使うことにする。
さて、メールで送る内容を取得・処理する側の話。過去に何度か調べてはダルそうで躊躇してきたpythonのHTMLParserライブラリ。躊躇してきた理由は、標準ライブラリのHTMLParserを拡張して処理をさせるっていうのがすげぇ面倒臭い。大体、HTMLを扱いやすいように構造化させるのっていかにも既に作られていそうだったし。
まずはlibxml2がどうやらちゃんとしてないHTMLでも解析してくれるらしいのでlibxml2のpythonバインディングを使ってxmlのように扱ってみることにした。参考にしたのは以下のサイト
上のサイトを参考に、以下のようなスクリプトを書いた。
import urllib2 import libxml2 f = urllib2.urlopen('http://www.hatena.ne.jp') html = f.read() f.close() doc = libxml2.htmlReadDoc(html, '', None, libxml2.HTML_PARSE_RECOVER + libxml2.HTML_PARSE_NOERROR + libxml2.HTML_PARSE_NOWARNING) links = doc.xpathEval('//a') for link in links: href = link.xpathEval('attribute::href') if len(href) > 0: href = href[0].content print href doc.freeDoc()
が、何も表示されない。htmlReadDoc()の出力はxmlDocのオブジェクトだけど、中身が何も無い。htmlReadDoc()の引数いじったり、英語のサイトでやってみたり、すごい単純なhtmlファイルをローカルに作ってやってみたりしたけど結果は皆同じ。で、作ったすごい単純なhtmlファイルをxmlファイルとして、xmlPasreDoc()で読ませたらうまくいった。が、これでは意味が無いのでlibxml2を使うことは止めにして他のを探すことにした。
探していたら、Beautiful Soupというライブラリがあり、しかもすごい使い易そうというわけでこっちを使うことに。どんなことができるのかは、以下のサイトを見ればわかるかと、もしくはBeautiful Soupのクイックスタート。
htmlタグのname、attrをキーに簡単にアクセスできるし、要素を辿るためのメソッドも揃ってる。ドキュメントを読みながら電車の中で現在試してるところ。これでいけそうだ、っていうか十分。
portageで配布されているので、家の環境にはこっからインストール、ありがとーGentoo。ノートのVine上ではpython関連はvineのaptでは管理しないという方針でそのままインストール。