Powered By 画RSS

python feedparser RSSを取得する

python RSSを取得する

pythonでRSSフィードを取得するには「feedparser」を使用する。
○feedparser
http://www.feedparser.org/

使用例がたっぷり上記のサイトにあり、インストール後すぐ活用できた。
インストール方法も簡単。

1.  zipをダウンロードをして、解凍する。
2. コマンドプロンプトを立ち上げて、解凍したフォルダにcdコマンドで移動する。
3.  setup.py install を実行。
4,  解凍したフォルダに「build\lib\feedparser.py」ができる。
5. 「feedparser.py」をpythonのインストールフォルダに配置

以上。まぁ標準的な方法だが。

使用例はたっぷりネット上に転がっているが、一応書いておく。

■使用例
import feedparser
fd = feedparser.parse('http://kbdpage.blog82.fc2.com/?xml')

#サイト名を表示
print fd.feed.title

#記事タイトルとリンクURLを表示
for i in range(3): 
  print fd.entries[i].title
  print fd.entries[i].link

#最新記事の更新時間
updatetime = time.strftime('%Y/%m/%d %X',fd.entries[0].updated_parsed)
print updatetime


簡単にRSSフィードを取得できるのは実に良い。
だが、取得に時間がかかるのが難点だ。(試しに3つ4つのサイトのRSSフィードを取得してみれば分かる)
これは別途対策をとる必要があるなぁ。

みんなのPython 改訂版
みんなのPython 改訂版

スポンサーサイト

Ironpython urllib2 が動かない 俺の土曜日ちゃんが息してない

■Ironpython urllib2が動かないってばよ・・・


     ∩___∩     /゙ミヽ、,,___,,/゙ヽ
     | 丿     ヽ    i ノ       `ヽ'
    /  ○   ○ |    / `(○)  (○)´i、  先生助けてっ!、
    | U  ( _●_)  ミ  彡,U ミ(__,▼_)彡ミ   土曜日ちゃんが息をしてないのっっ!!
   彡、    |∪| ,,/   ,へ、,   |∪|  /゙
   /  ヽ  ヽノ  ヾ_,,..,,,,_ /  '  ヽノ `/´ ヽ
   |      ヽ  ./ ,' 3  `ヽーっ   /    |
   │   ヾ    ヾl   ⊃ ⌒_つ ソ      │
   │    \__`'ー-⊃⊂'''''"__,,,ノ   |


VisualStudio2010 + Ironpython2.7 に手出してた。
そんで、さっそくはまった。

Ironpython で urllib.urlopen が動かない・・・。
でも、もう1時間はまってるのに、あきらめたくないよ・・・。


そんな風にしてたら、4時間経過してた件。




だが、解決した!

同じ理由ではまる人が現れて、ここで解決できることを願い、メモする。


■問題
urllib.urlopen を使うと以下のメッセージが表示され、動かない
[メッセージ]
TypeError: create_connection() takes at most 2 arguments (3 given)


■解決方法
この問題はIronpythonの公式サイトでも取り上げられていた。
http://ironpython.codeplex.com/workitem/28185

以下の作業を行う。

[修正ファイル]
ファイル名:@httplib.py
デフォルトパスで Ironpython をインストールした場合は、以下の場所にあるはず。
ファイルパス:C:\Program Files\IronPython 2.7\Lib\httplib.py

適当なエディタで開き、735行, 1151行 の2箇所修正する。
[修正前]
self.sock = socket.create_connection((self.host,self.port),
self.timeout, self.source_address)

[修正後]
self.sock = socket.create_connection((self.host,self.port),
self.timeout)

(同じ記載が735行目と1151行目にある)

以上。

上記の修正の後、urllib.urlopenを使用したところ、問題なく動いた。
土曜日ちゃんは無駄な犠牲ではなかったのだ・・・。


---
VisualStudio2010 +Ironpythonの日本語ドキュメントがほとんどなくて、困った。
ネット上のブログ記事もまだ旧バージョンの情報が大半で、載せててもインストール手順くらい。

上の問題も偶然、更新日を1年以内のIronpythonのWebサイトを探して、解決方法がみつかっただけ。
ヘボグラマが手出すにはちょっと早かったかな。

Ironpython2.7 は今現在アルファ版だから、この問題は正式版で直ってることでしょう。


IronPythonの世界 (Windows Script Programming) IronPythonの世界 (Windows Script Programming)
荒井 省三

ソフトバンク クリエイティブ
売り上げランキング : 392967

Amazonで詳しく見る

みんなのPython 改訂版 みんなのPython 改訂版
柴田 淳

ソフトバンククリエイティブ
売り上げランキング : 100279

Amazonで詳しく見る

Python difflibメモ

■Python 差異を抽出
4.4 difflib -- 差異の計算を助ける
http://www.python.jp/doc/2.5/lib/module-difflib.html

使う前に上記のリンク先にある↓を分かった上でじゃないと出力結果が訳分からなくなる。

コード

意味
'- '

'- ' 列は文字列1にのみ存在する

'+ '

'+ ' 列は文字列2にのみ存在する

' ' 列は両方の文字列で同一
'? ' 列は入力文字列のどちらにも存在しない

とりあえず差異が発生している行を抽出したかった。

import difflib

f1 = file('C:\\test\\0.txt').readlines()
f2 = file('C:\\test\\1.txt').readlines()
for i in difflib.unified_diff(f1,f2):
    if(i[0] == "+"):
        print i



差異が発生している行に + を付与して出力してくれるから (- も同様)
文字列の操作で先頭文字だけを取得して、条件分岐。




===追記====
以下のような形で使用した。
これで十分。




import difflib

f1 = file('C:\file1.txt').readlines()
f2 = file('C:\file2.txt').readlines()

linebox = []


for i in difflib.unified_diff(f1,f2):
    if(i[0] == "+"):
        linebox.append(i)

newfilepass = open('C:\memo\\diff_output.txt','w')
for writeline in linebox:
    newfilepass.write(writeline)

newfilepass.close()



---
入門用のが増えてんね。

python filecmp ファイルの比較

■python filecmp ファイルの比較
ファイルを比較したい場合、filecmp.cmp()を使用する。
http://www.python.jp/doc/2.4/lib/module-filecmp.html

使い方は...
filecmp.cmp(‘aaa,txt’,’bbb.txt’)
のように使い、aaa.txtとbbb.txtが同じファイルならTrueを、違うファイルならFalseを返す。

import filecmp

print filecmp.cmp(r'C:\test\filecmp.txt', r'C:\test\copyfilecmp.txt')


使ってみたところ、
半角スペース、改行がひとつでも入ってると違うファイルと判断して、Falseを返してくれるみたい。


ここから余談
上記のテストコードをEclipseで書いたらエラーが出力された。
こんな簡単なコードでなんでだ?と思って色々やったけど、解決されない。
結局プロジェクトを作り直して、動かしてみたら正常になった。
う~ん分からん・・・。

Python 自身のパスを取得する

■python スクリプトを実行した場所を取得する

関連:[Python]引数を取得する
http://kbdpage.blog82.fc2.com/blog-entry-7.html
この方法を知ったとき、あぁなるほどと思った。
関連記事書いたとき、気づきたかったが、この発想はなかった。

C:\testpgm\argv0.py とファイルを配置するとして。。。
以下のコードで実行。

import os
import sys

print sys.argv[0]
print os.path.abspath(sys.argv[0])

print os.getcwd()
print os.path.dirname(sys.argv[0])

>>> 実行結果
C:\testpgm\argv0.py
C:\testpgm\argv0.py
C:\testpgm
C:\testpgm


色変えたとこだけ、覚えておけばいいかな・・・。
下2行はオマケだし。

python 例外を取得する

■python 例外を取得する
traceback.format_exc()を使用する
http://www.python.jp/doc/2.4/lib/module-traceback.html

例外が起こった際に文字列を返してくれる。
ついでにその文字列をファイルに書き込むところまで、書いてみる。

import traceback
import datetime

today = datetime.datetime.today()

try:
    err = input("try:")
    print err
except:
    errorlog = traceback.format_exc()
    logtext = open("C:\\test\\log.txt","a+")
    logtext.write(today.__str__())
    logtext.write(errorlog)
    logtext.close()

このコードを実行すると、
try:
と入力が求められるので、日本語とか入力すれば、例外が発生する。
その例外結果が、C:\test\log.txtに書き込まれる。

open("C:\\test\\log.txt","a+")
  は、追記モードで開いているので、
再度例外が発生しても、以前の例外結果が上書きされることはない。

datetime.datetime.today()  は、ログファイルと想定するなら、日付も書き込んどいた
ほうがいいよなぁと思って追加。

以上。

Python os.walk() ファイルの階層を渡り歩く

■python os.walk()
14.1.4 ファイルとディレクトリ
http://www.python.jp/doc/2.5/lib/os-file-dir.html

os.walk(パス)と渡すと、パス以下のディレクトリから、パス/サブディレクトリ/ファイル名のタプルを
生成して返してくれる。
ぶっちゃけライブラリリファレンス一読しただけじゃ、どんな動作するか理解できなかった。
しかし、使ってみたところ、かなり便利な関数っぽいことが分かった。

では、簡単なコードから。

import os

for dpath,dnames,fnames in os.walk("C:\python26"):
    for fname in fnames:
        print dpath,":",fname

[実行結果]
C:\python26\Lib\test : test_enumerate.py
C:\python26\Lib\test : test_eof.py
C:\python26\Lib\test : test_epoll.py

                     ・
                     ・
                     ・
                     ・
C:\python26\Tools\Scripts : texcheck.py
C:\python26\Tools\Scripts : texi2html.py
C:\python26\Tools\Scripts : treesync.py

C:\python26 以下の階層を渡り歩いて、ディレクトリパスとファイルをprintしてくれる
こういう処理って再帰という処理が必要なんじゃないのかな。
それをwalk関数だけでやってくれるんだから、頼もしい。

これを活用して
ディレクトリ、サブディレクトリのファイルパスを取得して、そのファイルの更新時間とファイルサイズも同時に取得して、表示するプログラムを書いてみる。
以前の記事の復習にもなるしね。

く・・・横に長い・・・・

import os
import time
from stat import *

def fileinfo(filepass):
    filepass2 = os.stat(filepass)
    st_mtime_output = filepass2[ST_MTIME]
    size_input = os.path.getsize(filepass)
    time_fmt = time.strftime(output_fmt,time.localtime(st_mtime_output))
    return time_fmt,size_input

output_fmt = '%Y/%m/%d %H:%M:%S'

for dpath,dnames,fnames in os.walk("C:\python26"):
    for fname in fnames:
        filepass =  dpath + "\\" + fname
        time_fmt,size_input = fileinfo(filepass)
        print filepass,"LastUpdate :".rjust(16),time_fmt,"FileSize :".rjust(14),size_input

[実行結果(の一部)]
C:\python26\Tools\Scripts\pindent.py     LastUpdate : 2008/02/28 20:09:42     FileSize : 18420
C:\python26\Tools\Scripts\ptags.py     LastUpdate : 2005/10/28 19:06:40     FileSize : 1278
C:\python26\Tools\Scripts\pydocgui.pyw     LastUpdate : 2005/10/28 19:06:40     FileSize : 222

前回の記事で書いた rjust も組み入れてみた。
fileinfo関数は、ファイルパスを渡して、最終更新時間とファイルサイズを取得して返す処理を行う。

これに手を加えるだけで、かなり実用的になるんではないだろうか。

python ljust / center / rjust

■Python ljust / center / rjust
文字列に対して空白を追加する。

3.6.1 文字列メソッド
http://www.python.jp/doc/release/lib/string-methods.html

text1 = "Hello"
text2 = "python"
text3 = "World"

print "left",text1.ljust(10),"right"
print "left",text2.center(10),"right"
print "left",text3.rjust(10),"right"

print "left",text1.ljust(3),"right"
print "left",text2.center(3),"right"
print "left",text3.rjust(3),"right"

【実行結果】
left Hello      right
left   python   right
left      World right
left Hello right
left python right
left World right

>widthlen(s) よりも小さい場合、元の文字列が返されます。
下のprint文の実行結果が、空白が追加されていない理由。
ljust / center / rjust 全てにおいてこれが適用される。

wxpython 読み直し

wxpythonインストール
http://kbdpage.blog82.fc2.com/category2-1.html

この記事のサンプルコードを再度見直してみた。
動かなかったとぬかしてるコレ。

import wx

class MyApp(wx.App):
    def Oninit(self):
        Frm = wx.Frame(None,-1,"test")
        Frm.Show()
        Btn = wx.Button(Frm,-1,"push")
        return 1

app = MyApp()
app.MainLoop()



-よくよく考えて見直したみたところ・・・-
         ____
       /      \
      /  ─    ─\
    /    (●)  (●) \   ・・・・コレ "Oninit" じゃなくて "OnInit"だろ・・・・
    |       (__人__)    | ________
     \      ` ⌒´   ,/ .| |          |
    ノ           \ | |          | 
  /´                 | |          |
 |    l                | |          |
 ヽ    -一ー_~、⌒)^),-、   | |_________|
  ヽ ____,ノγ⌒ヽ)ニニ- ̄   | |  |

正しくは・・・

import wx

class MyApp(wx.App):
    def OnInit(self):
        Frm = wx.Frame(None,-1,"test")
        Frm.Show(True)
        Btn = wx.Button(Frm,-1,"push")
        return True
app = MyApp()
app.MainLoop()


だよ!
タイプミスじゃねぇか・・・。
恥ずかしい記事を投稿したもんだ。

修正したいところだけど、
追記だけ行って、タイプミスコードは戒めとして残しておこう・・・。

paramiko SSHで接続

■PythonでSSH
前回の記事のテストコード。
改めてみたら、もうちょい親切でも良いだろと思った。
という訳で、2回目。

import ssh

print "SSH START"

ipadr = raw_input('IP Address:')
usernm = raw_input('user name:')
passwd = raw_input('password:')

s = ssh.Connection(ipadr,
                   username=usernm,
                   password=passwd)

command = raw_input('command:')
cmd_result = s.execute(command)

s.close()

for rlt in cmd_result:
    print rlt

コマンドの実行結果を取得して、for文で画面に出力。
 image

こんな感じになる。(パスワードは、安直すぎるワードなので、隠しとこう)

前回も今回も WindowsからLinuxへのSSHだから
今度はLinuxにparamiko入れてSSHやって見ようか。

Linuxは、dictフォルダにssh.pyを入れて楽に使う方法ができるのかな。

NEXT≫
■スポンサードリンク
■プロフィール

ベタログ

管理人 : ベタログ (Twitterアカウント

思い立ったら、ジャンルを気にせず記事にする。それが自由というものだ。
そんな管理方針。
主に取り扱ってる事:オンラインゲーム(SDGO/Travian/ロードオブナイツ)、プログラミングメモ、ネット小説/書籍の感想/観葉植物など。

■まとめ記事
■カテゴリ
■最新記事
■PICKUP

個人的に押しているモノ


魚里高校ダンジョン部! 藻女神様と行く迷宮甲子園
魚里高校ダンジョン部! 藻女神様と行く迷宮甲子園
■感想記事
これぞ青春エンタメ小説。熱いですよ!

オーバーロード1 不死者の王
オーバーロード1 不死者の王
■感想記事
最強軍団が異世界を蹂躙するファンタジー。Web版も読めますが、凄まじい加筆がされているため、Web版読者も楽しめます。
■お勧め品
■最新コメント
■月別アーカイブ
検索フォーム
リンク