hrkt0115311の、迷えるプログラミング教室  RSSを登録する

プログラミングに興味はありますか? 素人が入門書片手にソースコード書いたりcgi作ったり、迷子になったりするメルマガです。広大なプログラミングの森で、一緒に迷子を楽しんでみませんか?

最新号をメルマガでお届けします    
登録 解除

規約に同意して

登録した方には、まぐまぐの公式メルマガ(無料)をお届けします。
2009/04/25

「hrkt0115311の、迷えるプログラミング教室」Vol.88 ~HTMLの部分置き換えスクリプトの巻~

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

                                             
                 「hrkt0115311の、迷えるプログラミング教室」Vol.88

━━━━━━━━━━━━━━━━━━━━━━━ HTMLの部分置き換えスクリプトの巻

おはようございます。今回も、Pythonでテキスト処理を行うスクリプトをお届けしますね。

メルマガを登録して下さってる方、それからLDRに登録して下さってる方、
初心者のメルマガにおつきあいいただきありがとうございます。
 http://www.mag2.com/m/0000267290.html
 http://reader.livedoor.com/about/http://archive.mag2.com/0000267290/rss10.xml

では、今号をお届けいたします!

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
○目次
 ・テキスト処理でしたいこと
 ・まずは複数行を変数にきちんと格納できるか確認
 ・基本的な処理を行えるように上記を改造
 ・ダブルクリック一発でスクリプトが走るように工夫
━━━━━━━━━━━━━━━━━━━━━━━━━━━免責事項

 ソースコードは、発行者が実際に動かし、構文チェックなどもしていますが
 ご利用になられて万一損害が生じた場合、保証することができません。
 ご利用になられる際は、ご自身でご確認になられた上で、お試し下さい。

━━━━━━━━━━━━━━━━━━言語処理系等の導入について

 Perl,PHP,Python,Rubyの入手先と、XAMPPの入手先を紹介します。

 ○The Perl Directory - perl.org
 http://www.perl.org/

 ○日本PHPユーザ会
 http://www.php.gr.jp/

 ○Python Japan User's Group
 http://www.python.jp/Zope/

 ○Ruby Install Guide
 http://preview.tinyurl.com/4ghc3o

 ○XAMPP
 http://www.apachefriends.org/jp/xampp.html

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

○ テキスト処理でしたいこと

 ・ナリ語フィルタを作成したナリ - 迷い楽しむプログラミング - EPG
  http://enjoy-programming.g.hatena.ne.jp/hrkt0115311/20080723/narinari

去年、Rubyで書いたスクリプトと仕組みは同じ、「置き換え」をPythonで行いました。

はてなダイアリー以外でも、はてな記法を使いたいと思い、
以下のような工夫をしています。

 ・その後の、どんなジレンマ  はてなダイアリーをはてな記法エディタとして使う方法
  http://hrkt0115311.blog10.fc2.com/blog-entry-2670.html

例えば、はてな記法で以下のように書くと、HTMLソースは――

id:hrkt0115311:detail
[http://d.hatena.ne.jp/hrkt0115311/20090125/1232869983:title:bookmark]
[f:id:hrkt0115311:20090422130228j:image:w350]

下記のようになります。

-------------------------------------------------------------------------------
<div class="section">
			<p><a href="http://d.hatena.ne.jp/hrkt0115311/" class=
"hatena-id-icon"><img src="http://www.hatena.ne.jp/users/hr/hrkt0115311/profil
e_s.gif" alt="id:hrkt0115311" class="hatena-id-icon" width="16" height="16">id
:hrkt0115311</a></p>
			<br>

			<p><a href="http://d.hatena.ne.jp/hrkt0115311/20090125/
1232869983" target="_blank">「灰色の男たち」はもしかしたら僕らなんじゃなかろうか
?――『モモ』ミヒャエル・エンデ著 - どんなジレンマ</a><a href="http://b.hatena.
ne.jp/entry/http://d.hatena.ne.jp/hrkt0115311/20090125/1232869983" class="http-b
ookmark" target="_blank"><img src="http://b.hatena.ne.jp/entry/image/http://d.ha
tena.ne.jp/hrkt0115311/20090125/1232869983" alt="" class="http-bookmark"></a></p>
			<br>

			<p><a href="http://f.hatena.ne.jp/hrkt0115311/2009042213
0228" class="hatena-fotolife" target="_blank"><img src="http://f.hatena.ne.jp/im
ages/fotolife/h/hrkt0115311/20090422/20090422130228.jpg" alt="f:id:hrkt0115311:2
0090422130228j:image:w350" title="f:id:hrkt0115311:20090422130228j:image:w350" c
lass="hatena-fotolife" width="350"></a></p>

		</div>
-------------------------------------------------------------------------------
                    メルマガ配信の都合上、改行しています。

「 class="http-bookmark"」とか不要なので、毎回秀丸エディタで空文字で置き換えて
削除しています。繰り返し行う処理なので、スクリプトにしちゃおうと思いました。

また、「読むcrossreview ( http://hrkt0115311.tumblr.com/ )」を更新する際にも
似たような作業が必要なので、この処理も含めてスクリプトを書きました。


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

○ まずは複数行を変数にきちんと格納できるか確認

#-*- coding:shift_jis -*-
import re
#一つの変数に改行を含んだ文字列を与えて格納できたか確認するスクリプト


s = '''
<div class="section">
			<p><a href="http://d.hatena.ne.jp/hrkt0115311/" class="h
atena-id-icon"><img src="http://www.hatena.ne.jp/users/hr/hrkt0115311/profile_s.
gif" alt="id:hrkt0115311" class="hatena-id-icon" width="16" height="16">id:hrkt0
115311</a></p>
			<br>

			<p><a href="http://d.hatena.ne.jp/hrkt0115311/20090125/1
232869983" target="_blank">「灰色の男たち」はもしかしたら僕らなんじゃなかろうか
?――『モモ』ミヒャエル・エンデ著 - どんなジレンマ</a><a href="http://b.hatena.
ne.jp/entry/http://d.hatena.ne.jp/hrkt0115311/20090125/1232869983" class="http-b
ookmark" target="_blank"><img src="http://b.hatena.ne.jp/entry/image/http://d.ha
tena.ne.jp/hrkt0115311/20090125/1232869983" alt="" class="http-bookmark"></a></p>
			<br>

			<p><a href="http://f.hatena.ne.jp/hrkt0115311/2009042213
0228" class="hatena-fotolife" target="_blank"><img src="http://f.hatena.ne.jp/im
ages/fotolife/h/hrkt0115311/20090422/20090422130228.jpg" alt="f:id:hrkt0115311:2
0090422130228j:image:w450" title="f:id:hrkt0115311:20090422130228j:image:w450" c
lass="hatena-fotolife" width="450"></a></p>

		</div>


★このユーザーから購入する
★レビューする
★    * 
★crossreviewから購入する
'''

print s

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

○ 基本的な処理を行えるように上記を改造

#-*- coding:utf-8 -*-
import re
'''
置き換えスクリプト。
日本語も処理するのでShift-jisではなくUTF-8で作成。

変数sに入れた文字列から、sub()メソッドで指定した文字列を
空文字に置き換えることで削除する。

注意点。Windowsのコマンドプロンプトでこのスクリプトを使うと
コマンドプロンプトの出力結果が文字化けしてしまう。
(コマンドプロンプトがshift-jisだから)

そのため、「python hoge.py > hoge.txt」といった形で
テキストファイルに出力すると、自動的にUTF-8のファイルが
作成され、文字化けせずに済む。

'''

s = '''
<div class="section">
			<p><a href="http://d.hatena.ne.jp/hrkt0115311/" class="h
atena-id-icon"><img src="http://www.hatena.ne.jp/users/hr/hrkt0115311/profile_s.
gif" alt="id:hrkt0115311" class="hatena-id-icon" width="16" height="16">id:hrkt0
115311</a></p>
			<br>

			<p><a href="http://d.hatena.ne.jp/hrkt0115311/20090125/1
232869983" target="_blank">「灰色の男たち」はもしかしたら僕らなんじゃなかろうか
?――『モモ』ミヒャエル・エンデ著 - どんなジレンマ</a><a href="http://b.hatena.
ne.jp/entry/http://d.hatena.ne.jp/hrkt0115311/20090125/1232869983" class="http-b
ookmark" target="_blank"><img src="http://b.hatena.ne.jp/entry/image/http://d.ha
tena.ne.jp/hrkt0115311/20090125/1232869983" alt="" class="http-bookmark"></a></p>
			<br>

			<p><a href="http://f.hatena.ne.jp/hrkt0115311/2009042213
0228" class="hatena-fotolife" target="_blank"><img src="http://f.hatena.ne.jp/im
ages/fotolife/h/hrkt0115311/20090422/20090422130228.jpg" alt="f:id:hrkt0115311:2
0090422130228j:image:w450" title="f:id:hrkt0115311:20090422130228j:image:w450" c
lass="hatena-fotolife" width="450"></a></p>

		</div>

★このユーザーから購入する
★レビューする
★    * 
★crossreviewから購入する

'''

#この部分で置き換えを行っている
s2 = re.sub('<div class="section">', "", s)
s3 = re.sub("\t", "", s2)
s4 = re.sub("<p>", "", s3)
s5 = re.sub("</p>", "", s4)
s6 = re.sub("<br>", "", s5)
s7 = re.sub(' class="hatena-id-icon"', "", s6)
s8 = re.sub(' class="http-bookmark"', "", s7)
s9 = re.sub(' alt=""', "", s8)
s10 = re.sub(' class="hatena-fotolife"', "", s9)
s11 = re.sub('</div>',"",s10)
s12 = re.sub('    \* ',"",s11)
s13 = re.sub('レビューする',"",s12)
s14 = re.sub('このユーザーから購入する',"",s13)
s15 = re.sub('crossreviewから購入する',"",s14)

print s15

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

○ ダブルクリック一発でスクリプトが走るように工夫

#-*- coding:utf-8 -*-
import re
#ダブルクリックで処理できるように変更
#test.txtとこのスクリプトのファイルは必ずUTF-8で保存すること

#変数sにファイルを読み込み
f = open('test.txt','r') #読み込み専用モードでテキストファイルを読み込み
s = f.read() #ファイル読み込み
f.close()


#変数sに対してsub()メソッドを行い、結果を次の変数snに返す
s2 = re.sub('<div class="section">', "", s)
s3 = re.sub("\t", "", s2)
s4 = re.sub("<p>", "", s3)
s5 = re.sub("</p>", "", s4)
s6 = re.sub("<br>", "", s5)
s7 = re.sub(' class="hatena-id-icon"', "", s6)
s8 = re.sub(' class="http-bookmark"', "", s7)
s9 = re.sub(' alt=""', "", s8)
s10 = re.sub(' class="hatena-fotolife"', "", s9)
s11 = re.sub('</div>',"",s10)
s12 = re.sub('    \* ',"",s11)
s13 = re.sub('レビューする',"",s12)
s14 = re.sub('このユーザーから購入する',"",s13)
s15 = re.sub('crossreviewから購入する',"",s14)


#処理結果が入っている変数s15の内容をtest2.txtに書き出す
f2 = open('test2.txt','w')
f2.write(s15)
f2.close()


以上のような流れで、このスクリプトを書きました。
なお、半角英数の場合はShift-jisで保存しても問題なく動きます。
しかし、日本語フォントも含む場合はUTF-8でファイルを保存しないと
きちんと動かないです。


■ 編集後記
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

自動化できるものは自動化すると勉強になるよ。そう教えてもらっても、なかなか
私の腕で自動化できることって少ないんですよね。今回作ったスクリプトは
単純なスクリプトですが、秀丸エディタで手作業で置き換えを指示していた時よりは
効率化できたと思います。

また、身近な課題を見つけたら、スクリプトにしてみますね。
それでは、次号でまたお会いしましょう。


■ いただいた反響について
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

「こんな仕組み作れないかな」とか「説明不足で分からないよ」といったご指摘を
お寄せいただけると嬉しいです。みなさまの声で、メルマガを育てていきたいです。

また、頂戴したメールをこのメルマガで紹介させていただくかもしれません。
もし、公開を望まれない場合は、恐れ入りますが、「発行者のhtkt0115311に読んで
欲しいだけで、メルマガには掲載しないで」などとお書き下さると助かります。

■ 転送や再配布について
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

 このメルマガをご紹介いただく際は、
 このメルマガのURL http://www.mag2.com/m/0000267290.html などを
 並記し、私の書いた文章であると分かる形にして下さると幸いです。
 メルマガの転送については、転送者さん・転送されたメールを受信される方に
 迷惑でない範囲であれば歓迎いたします。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 メールマガジン「hrkt0115311の、迷えるプログラミング教室」

 ○発行者      htkt0115311(どんジレ)
 ○発行システム  『まぐまぐ!』 http://www.mag2.com/
 ○配信中止はこちら http://www.mag2.com/m/0000267290.html
 ○公式サイト    http://enjoy-programming.g.hatena.ne.jp/hrkt0115311/
 ○blog       http://hrkt0115311.blog10.fc2.com/
 ○Twitter     https://twitter.com/hrkt0115311
 ○はてなハイク   http://h.hatena.ne.jp/hrkt0115311/
 ○Wassr      http://wassr.jp/user/hrkt0115311
 ○お問い合わせ   enjoy.ruby@gmail.com

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
最新号をメルマガでお届け
登録 解除

規約に同意して

登録した方には、まぐまぐの公式メルマガ(無料)をお届けします。

最近の記事

上へ戻る