Hatena::ブログ(Diary)

progd RSSフィード

2010-01-03

指定したサイトから文字列を正規表現で抜き出す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)

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/progd/20100103/1262487918
Connection: close