指定したサイトから文字列を正規表現で抜き出すpythonスクリプト
#!/usr/bin/env python2.6 #coding: utf-8 import urllib2 import chardet import sys import re # コマンドライン引数を取得 argvs = sys.argv if len(argvs) != 3: print "usage: python %s url regex" % argvs[0] quit() url = argvs[1].decode('utf-8') regex = argvs[2].decode('utf-8') # 引数の正規表現文字列を( )で囲んで、正規表現オブジェクトを生成 reg_patt = re.compile(u"(%s)" % regex) # WebページのHTMLを取得 html = urllib2.urlopen(url).read() # ページのエンコードを取得 encoding = chardet.detect(html)['encoding'].decode() # HTMLをUnicodeに変換 html = unicode(html, encoding, 'ignore') try: match_list = [] while 1: m = reg_patt.search(html) # マッチしないと m = None match_list.append(m.group()) # マッチ部分の文字列をリストに追加 html = html[m.end():] # 検索した部分を取り除く except AttributeError: pass for s in match_list: print s
メソッドにまとめる
#!/usr/bin/env python2.6 #coding: utf-8 import urllib2 import chardet import sys import re def get_page(url): url = unicode(url) # WebページのHTMLを取得 html = urllib2.urlopen(url).read() # ページのエンコードを取得 encoding = chardet.detect(html)['encoding'].decode() # HTMLをUnicodeに変換 html = unicode(html, encoding, 'ignore') return html def search_all(str, reg_patt): try: match_list = [] while 1: m = reg_patt.search(str) # マッチしないと m = None match_list.append(m.group()) # マッチ部分の文字列をリストに追加 str = str[m.end():] # 検索した部分を取り除く except AttributeError: pass return match_list if __name__ == "__main__": # コマンドライン引数を取得 argvs = sys.argv if len(argvs) != 3: print "usage: python %s url regex" % argvs[0] quit() html = get_page(argvs[1]) regex = argvs[2].decode('utf-8') # 引数の正規表現文字列を( )で囲んで、正規表現オブジェクトを生成 reg_patt = re.compile(u"(%s)" % regex) for s in search_all(html, reg_patt): print s
ちなみに、URLなどを取り出すときに「&」が「&」などになってしまうのが困る場合、cgi.unescapeを使えばよい。
sudo easy_install cgi.unescape
でインストールして、スクリプトに以下を追記。
from cgi import unescape
print unescape(s)