HTMLParser.HTMLParserでリンクを抽出

#!python
# vim:fileencoding=utf-8

from HTMLParser import HTMLParser
import urllib2
from urlparse import urlparse

class ExtractTextLinkParser(HTMLParser):
    
    def __init__(self):
        HTMLParser.__init__(self)
        self.links = []
        self.url = ""
        self.text = ""

    def handle_starttag(self, tag, attrs): # 開始タグを見つけた場合の処理
        if tag == "a":          # タグ、属性名は全て小文字
            attrs = dict(attrs) # ((属性名, 値), ...) => {属性名:値, ...}
            if "href" in attrs:
                self.url = attrs["href"]

    def handle_endtag(self, tag): # 終了タグを見つけた場合の処理
        if tag == "a":
            if self.text:         
                self.links.append((self.url, self.text))
            self.url = self.text = ""
    
    def handle_data(self, data): # 開始・終了タグに囲まれた中身の処理
        if self.url:             
            self.text += data    

def get_links(url):
    response = urllib2.urlopen(url)
    parser = ExtractTextLinkParser() 
    parser.feed(response.read())    
    parser.close()
    links = parser.links
    return [l for l in links 
            if l[0].find("://") != -1 and not l[0].startswith(url)]

links = get_links("http://b.hatena.ne.jp/hotentry")
links = [l for l in links if urlparse(l[0])[0]][3:]
for url, title in links[:10]:
    print "[%s:title=%s]" % (url, title.decode("utf-8", "replace"))
テキストエディタでWebサイト構築をガンバル人へ(1/3) − @IT
日本の携帯を高くしている真犯人は
404 Blog Not Found:38歳までに知ることになる、22歳の自分に教えてあげたいたった1つのこと
ウェブ制作・プログラマー・デザイナーのためのチートシート集 | コリス
 やる夫がはてなブックマークを始めたようです。 - 朱雀式
2015年、テレビは「ニコ動」化する?――NRIが示す未来像 (1/2) - ITmedia News
パソコン好きが青色申告を体験してみると?:第1回 まずは税金ってナニ? (1/5) - ITmedia Biz.ID
らばQ : 42歳までに知ることになる、22歳の自分に教えてあげたい12のこと
「見て欲しい」の本質忘れるな--吉本が語るネット時代の権利者像:コラム - CNET Japan
「真のゆとり教育」が生んだ18歳天才プログラマー トレンド-インタビュー:IT-PLUS