club21の掲示板一覧を取得する

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import codecs, sys

db = [
("http://metro21.com/cgi-bin/salon/vlist.cgi"     ,'サロン・ド・メトロ'),
("http://club21.org/cgi-bin/topn/vlist.cgi"       ,'トップノッチ1'),
("http://club21.org/cgi-bin/topn2/vlist.cgi"      ,'トップノッチ2'),
("http://club21.org/cgi-bin/topn3/vlist.cgi"      ,'トップノッチ3'),
("http://club21.org/cgi-bin/topn4/vlist.cgi"      ,'トップノッチ4'),
("http://club21.org/cgi-bin/topn5/vlist.cgi"      ,'トップノッチ5'),
("http://club21.org/cgi-bin/topn6/vlist.cgi"      ,'トップノッチ6'),
("http://club21.org/cgi-bin/maison/vlist.cgi"     ,'メゾン・ド・メトロ1'),
("http://club21.org/cgi-bin/maison2/vlist.cgi"    ,'メゾン・ド・メトロ2'),
("http://club21.org/cgi-bin/maison3/vlist.cgi"    ,'メゾン・ド・メトロ3'),
("http://club21.org/cgi-bin/maison4/vlist.cgi"    ,'メゾン・ド・メトロ4'),
("http://club21.org/cgi-bin/maison5/vlist.cgi"    ,'メゾン・ド・メトロ5'),
("http://club21.org/cgi-bin/maison6/vlist.cgi"    ,'メゾン・ド・メトロ6'),
("http://club21.org/cgi-bin/maison7/vlist.cgi"    ,'メゾン・ド・メトロ7'),
("http://club21.org/cgi-bin/maison8/vlist.cgi"    ,'メゾン・ド・メトロ8'),
("http://metro21.com/cgi-bin/kiki/vlist.cgi"      ,'メゾン・ド・キキ'),
("http://metro21.com/cgi-bin/mike/vlist.cgi"      ,'メゾン・ド・ミケ'),
("http://metro21.com/cgi-bin/boo/vlist.cgi"       ,'メゾン・ド・ぶー'),
("http://metro21.com/cgi-bin/pooh/vlist.cgi"      ,'メゾン・ド・プー'),
("http://metro21.com/cgi-bin/pochi/vlist.cgi"     ,'メゾン・ド・ポチ'),
("http://metro21.com/cgi-bin/pon/vlist.cgi"       ,'メゾン・ド・ポン'),
("http://metro21.com/cgi-bin/leo/vlist.cgi"       ,'メゾン・ド・レオ'),
("http://metro21.com/cgi-bin/kero/vlist.cgi"      ,'メゾン・ド・ケロ'),
]


import urllib.request
import encodings
import time


def analys_url(url):
  with urllib.request.urlopen(url) as page:
    try:
      s = page.read()
      s = s.decode('shift-jis', 'ignore')
    except Exception as e:
      print("urllib error at: %s\n%s" % (url,e))
    
  result = ''
  for i in filter(lambda a: a.startswith('<TD WIDTH="33%"'), s.split("\n")):
    l = i.split('<BR><a href="')
    try:
      bbs_num  = l[0].split('<H3>')[1]
      bbs_name = l[1].split('">')[1].split('</a>')[0]
      bbs_url  = url[:-9]+l[1].split('">')[0]
      #print(l)
      result += "<a href='%s' target='main'>%s</a><br>\n" % (bbs_url, bbs_name)
    except Exception as e:
      print("analys error at: %s\n%s\n" % (l, e))

  return result


  
html = """
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<TITLE>club21 index</TITLE>
<BASE TARGET="cont">
</HEAD>

<BODY TEXT="#CC3300" BGCOLOR="#FFFFFF" 
link="#0000FF" alink="#ff0000" vlink="#660099">

<BR>
<font size=2>

%s

<!-- <br>更新日14/08/12 -->
</font>
</BODY></HTML>
"""

result = ''
for i in db:
  time.sleep(10)
  result += '<BR><BR><B>%s</B><BR>' % i[1]
  result += analys_url(i[0])

with open('c.html', 'w') as f: f.write( html%result )


2ch風のメニューにするのにframeを使う。書き方を忘れたので一応メモっておく

<html>
    <frameset cols="300,*">
        <frame src="menu.html" name="menu">
        <frame name="main">
    </frameset>
</html>