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

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

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

規約に同意して

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

「hrkt0115311の、迷えるプログラミング教室」Vol.87 ~HTMLからURLを引っこ抜いてますの巻~

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

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

━━━━━━━━━━━━━━━━━━━━━━━ HTMLからURLを引っこ抜いてますの巻

めずらしく二日連続の登場です。おはようございます。
雪とか槍とか降らないといいのだけど……。

メルマガを登録して下さってる方、それから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

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

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

例えば、こんなケースで正規表現を使ったテキスト処理をしています。

 crossreview(クロスレビュー)
 http://crossreview.jp/

上記を読んで、下記を編集しています。

 読むcrossreview
 http://hrkt0115311.tumblr.com/

tumblrはリブログがあるので、情報を拡散させるのに素敵なツールなんだけど、
英数半角文字じゃないと検索できないみたいなんです。これちょっと不便なので、
更新かけたら、リストをblogにまとめるようにしています。

 その後の、どんなジレンマ  今日の読むcrossreview
 http://hrkt0115311.blog10.fc2.com/blog-entry-2682.html

↑こんな感じです。

これを行う際に、正規表現を使ってHTMLファイルからURLを引っこ抜く処理を
利用しています。URLの重複削除・降順ソートなどもあわせて行っているので
表計算ソフトを使わなくても済むようになりました。

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

○ まず、書いてみた

#-*- coding:shift_jis -*-
#htmlファイルを読み込み、URLを引っこ抜くスクリプト
#test.htm に、処理したいHTMLファイルを入れて下さい

import re

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

url = re.findall('(https?:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)">',s)
a = list(set(url)) #重複削除
a.sort() #ソート

for i in a:
    print i

URLの末尾が">で終わっていないと正しく引っこ抜けないのだけど、とりあえず
これで動きます。降順ソートは、まだこのスクリプトでは実現できていません。

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

○ ダブルクリックで処理かけられるように工夫してみた

#-*- coding:shift_jis -*-
#htmlファイルを読み込み、URLを引っこ抜くスクリプト
test.txtに、処理したいHTMLファイルを入れて下さい

import re

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

url = re.findall('(https?:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)">',s)
a = list(set(url)) #重複削除
a.sort() #ソート

#for i in a:    #コマンドプロンプトで使う時はこのforループを使う
#    print i

f2 = open('test2.txt','w') #引っこ抜いたURLを「test2.txt」というテキストファイルで保存
f2.writelines(a) #writelines()は、リストを書き込む関数
f2.close()


Linuxではなく、WindowsでPythonのスクリプトを書くことが多いです。
環境変数を通してあるので、コマンドプロンプトを開いて呼びださなくても、
拡張子で言語処理系を判断して仕事してくれるので、ダブルクリックで
スクリプトが走るように改造しました。

コマンドプロンプトの場合は、

>python hoge.py > test2.txt

などとして出力結果をファイルに保存することができますよね。
コマンドプロンプトを使わずにテキストファイルを出力したいので、ファイルを
保存するように作ってみました。ただし、writelinesメソッドを使ってリストの中身を
書き出したところ、改行がなくて一行の文字列がだだーっと出力されてしまいました。

ダブルクリックでいけたけど、秀丸の正規表現置き換えで、「http」を「\nhttp」として
整形する必要があります……。あと、まだこの段階だと、降順ソートを入れることが
出来ていません。

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

○ 降順ソートと、リストの要素末尾に改行を入れることを試してみた

#-*- coding:shift_jis -*-
#htmlファイルを読み込み、URLを引っこ抜くスクリプト
#test.txtに処理をかけたいHTMLソースを入れる

import re

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

url = re.findall('(https?:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)">',s)
a = list(set(url)) #重複削除
a.sort() #ソート

b = []
for i in a:
    b.append(i + '\n') #リストbを用意して、リストaの要素一つずつに改行を追加

b.reverse() #ソートが降順なので、ひっくり返すことで降順にする

f2 = open('test2.txt','w')
f2.writelines(b)
f2.close()


降順ソートはreverseメソッドを使っています。sortメソッドが昇順なので、こいつを
ひっくり返せば降順になりますよね。

それから、リスト要素の末尾に改行がなかった問題については、
リストをもう一つ用意して、forループで一つ一つの要素に「.append(i + '\n')」
という処理をかけています。

以上で、

 ・HTMLファイルからURLを抜きたい
 ・抜いたURLは重複削除したい
 ・降順にソートしたい
 ・テキストファイルを出力したい
 ・コマンドプロンプトを通さずに、ダブルクリックで処理かけたい

という願いは一応かなえられました。少しずつ手直しをして、道具が使い易く
なっていくのが嬉しいなぁと感じています。


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

二日連続で配信するのは、昨年の秋以来ですね。Pythonの学習、ちょっとずつ
進めているので、この二日で手持ちのネタを放出してしまいました。

また書くことをためて、メルマガ書きますね。
それでは、次号でお会いしましょう^^


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

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

また、頂戴したメールをこのメルマガで紹介させていただくかもしれません。
もし、公開を望まれない場合は、恐れ入りますが、「発行者の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

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

規約に同意して

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

最近の記事

上へ戻る