htmllib.HTMLParserでリンクを抽出

#!python
# vim:fileencoding=utf-8

from htmllib import HTMLParser
from formatter import NullFormatter
import urllib2
from urlparse import urlparse

class ExtractTextLinkParser(HTMLParser):
    
    def __init__(self):
        HTMLParser.__init__(self, NullFormatter())
        self.links = []

    def anchor_bgn(self, href, name, type): # <a>が見つかった場合の処理
        HTMLParser.anchor_bgn(self, href, name, type)
        self.save_bgn() # テキストデータの保存を開始

    def anchor_end(self):      # </a>が見つかった場合の処理
        url = self.anchor
        text = self.save_end() # 保存されたテキストデータを取得
        if url and text:
            self.links.append((url, text))
        self.anchor = None

def get_links(url):
    response = urllib2.urlopen(url)
    parser = ExtractTextLinkParser() 
    parser.feed(response.read())    
    parser.close()
    return parser.links

links = get_links("http://b.hatena.ne.jp/hotentry")
links = [l for l in links if urlparse(l[0])[0]]
for url, title in links[5:15]:
    print "[%s:title=%s]" % (url, title.decode("utf-8", "replace"))
日本の携帯を高くしている真犯人は
テキストエディタでWebサイト構築をガンバル人へ(1/3) − @IT
ウェブ制作・プログラマー・デザイナーのためのチートシート集 | コリス
404 Blog Not Found:38歳までに知ることになる、22歳の自分に教えてあげたいたった1つのこと
Gmailアカウント間でのメール移転方法・複数Gmailアカウントの処理に困っている人に朗報! | Google Mania - グーグルの便利な使い方


HTMLParser.HTMLParserの場合は複数のタグを処理する場合、ifで分岐させる必要がありますが、htmllib.HTMLParserの場合はタグごとにメソッドが用意されています。また、単にURLだけを取得したいならサブクラスを作らなくても可能です。

>>> r = urllib2.urlopen("http://b.hatena.ne.jp/hotentry")
>>> p = HTMLParser(NullFormatter())
>>> p.feed(r.read())
>>> p.close()
>>> links = p.anchorlist # URLのリストを取得
>>> print "\n".join([l for l in links if urlparse(l)[0]][5:10])
http://www.phs-mobile.com/black/black33.html
http://www.atmarkit.co.jp/fwcr/rensai/freeauthoring06/freeauthoring06_1.html
http://coliss.com/articles/build-websites/operation/work/796.html
http://blog.livedoor.jp/dankogai/archives/50997519.html
http://google-mania.net/archives/891